Elixir: Elixir 1.9に備わった新機能
Tags: elixir, webdev, tutorial, programming
Published: 2019-05-09 10:03:34

---
title: Elixir: Elixir 1.9に備わった新機能
published: true
description: 2019年4月29日付Plataformatec blog「What’s new in Elixir – Apr/19」にもとづき、公式ドキュメントなどの情報を補って、v1.9.0-devに加えられた新機能についてご説明します。
tags: #elixir #webdev #tutorial #programming
---

2019年4月29日付でPlataformatec blogに公開された「[What’s new in Elixir – Apr/19](http://blog.plataformatec.com.br/2019/04/whats-new-in-elixir-apr-19/)」で、v1.9.0-devに加えられた新機能が紹介されました。本稿は、その記事に公式ドキュメントなどの情報を補ってご説明します。


# `mix release`の追加
新たに[`mix release`](https://hexdocs.pm/mix/master/Mix.Tasks.Release.html)が備わりました。基本的なリリースに加え、ランタイム設定、テンプレートファイルによるカスタマイズ、カスタムステップなどがサポートされます。

`mix release`は現行のプロジェクトの自己完結したリリースを組み立てます。

```elixir
MIX_ENV=prod mix release
MIX_ENV=prod mix release NAME
```

リリースがつくられると、ターゲットに向けてパッケージ化し、デプロイできます。ターゲットは、同じオペレーティングシステム(OS)のディストリビューションおよびバージョンで、`mix release`コマンドが実行されたマシンで動かしておかなければなりません。

リリースは、`mix.exs`ファイルの`def project`において`:releases`キーにより設定できます。

```elixir
def project do
  [
    releases: [
      demo: [
        include_executables_for: [:unix],
        applications: [runtime_tools: :permanent]
      ],

      ...
    ]
  ]
end
```


# `mix new`で設定ファイルをつくらない
まず、`mix new`で`config/config.exs`をつくらなくなりました。設定ファイルに依存することは、ライブラリやその作者にとって望ましくないとされてきたからです(「[Avoid application configuration](https://hexdocs.pm/elixir/master/library-guidelines.html#avoid-application-configuration)」)。つぎに、`mix new --umbrella`は、子アプリケーションごとの設定はつくりません。すべての設定は、アンブレラプロジェクトのルートで宣言することになります。理由については「[No longer generate config for mix new](https://github.com/elixir-lang/elixir/pull/8932)」をご参照ください。


# Elixirに新たな`Config`モジュールを追加
リリースは独自の設定がされるかもしれません。また、ビルドツールのMixに依存するのは望ましくないでしょう。そこで、`use Mix.Config`はやわらかな非推奨(soft-deprecated)となります(やわらかな非推奨については「[Elixir: バージョン間の互換性と非推奨](https://dev.to/gumi/elixir--254a)」参照)。これからは、Elixirに新たに備わった[`Config`モジュール](https://hexdocs.pm/elixir/master/Config.html)を`import Config`としてお使いください。

つぎのふたつの部分で互換性が破られます(「[Add config providers](https://github.com/elixir-lang/elixir/pull/8957)」参照)。

- 設定モジュールの追加
    - `Config`
    - `Config.Reader`
    - `Config.Provider`
- リリースに`Config.Provider`のサポートを追加

| 旧 | 新 |
|:--|:--|
| use Mix.Config | import Config |
| Mix.Config.merge/2 | Config.Reader.merge/2 |
| Mix.Config.read!/2 | Config.Reader.read!/2 |
| Mix.Config.eval!/2 | Config.Reader.read_imports!/2 |
| Mix.Config.persist/1 | Application.put_all_env/2 |


# ロガーのパフォーマンス向上
ロガーは、メッセージが破棄されるときの処理を効率化しました。また、Erlang/OTP v21.2以降により、全体のパフォーマンスが向上しています。


# その他の新機能

## `~U`シギルの追加
UTC [`DateTime`](https://hexdocs.pm/elixir/master/DateTime.html)をつくる[`~U`](https://hexdocs.pm/elixir/master/Kernel.html#sigil_U/2)が加わりました(「[Add ~U sigil for UTC date times](https://github.com/elixir-lang/elixir/pull/8824)」参照)。なお、`~u`はありません。

## 新たな関数
設定ファイルを簡単にできるように、つぎの3つの関数が新たに加わりました(「[Add support for a default value in System.get_env/1](https://github.com/elixir-lang/elixir/pull/3798)」参照)。

- [`System.get_env/2`](https://hexdocs.pm/elixir/master/System.html#get_env/2)
- [`System.fetch_env/1`](https://hexdocs.pm/elixir/master/System.html#fetch_env/1)
- [`System.fetch_env!/1`](https://hexdocs.pm/elixir/master/System.html#fetch_env!/1)

## 細かな変更
細かな変更については、「[Changelog for Elixir v1.9](https://github.com/elixir-lang/elixir/blob/master/CHANGELOG.md)」をご参照ください。