Do you want to pick up from where you left of?
Take me there

Mix

私たちがElixirの深海へと潜れるようになる前に、まずmixについて学ぶ必要があります。Rubyに詳しければ、mixとはBundlerとRubyGems、そしてRakeが組み合わさったものです。あらゆるElixirプロジェクトに欠かせない部分であり、このレッスンではその素晴らしい機能のうち、ほんの一部を探検していきます。あなたの環境でmixが提供する全ての機能を知るにはmix helpを実行してください。

今まではもっぱら制限のある iex の内部で取り組んできました。何か実際に動くものを作るには、コードを複数のファイルに分けて効率的に管理する必要があります。そしてmixは複数のプロジェクトでそうした開発を支えます

新しいプロジェクト

新しいElixirプロジェクトを立ち上げる準備ができたら、mixのmix newコマンドで簡単に行えます。これにより、プロジェクトのフォルダ構成と必要なボイラープレート(決まりきったソースコード断片)が生成されます。とても分かりやすいですね、始めましょう:

mix new example

実行結果から、mixがディレクトリと一連のボイラープレートファイルを作っていることがわかります:

* creating README.md
* creating .gitignore
* creating .formatter.exs
* creating mix.exs
* creating lib
* creating lib/example.ex
* creating test
* creating test/test_helper.exs
* creating test/example_test.exs

このレッスンでは mix.exs に焦点を合わせていきます。アプリケーションや依存関係、環境、そしてバージョンについて設定を行うところです。このファイルをお好きなエディタで開いてください。このような感じに見えるはずです(コメントは簡潔さのために除いています):

defmodule Example.Mix do
  use Mix.Project

  def project do
    [
      app: :example,
      version: "0.1.0",
      elixir: "~> 1.5",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  def application do
    [
      extra_applications: [:logger]
    ]
  end

  defp deps do
    []
  end
end

最初に見える項目は project です。ここでアプリケーションの名前(app)を定義し、そのバージョン(version)と用いるElixirのバージョン(elixir)と、最後に依存関係(deps)を記述します。

application の項は、次項で扱うアプリケーションファイルの生成時に使用します。

対話的な方法

アプリケーションの機能や設定を利用できる環境の中で iex を使う必要があるかもしれません。ありがたいことに、mixを使えば簡単です。コンパイルされたアプリケーションとともに新しい iex セッションを開始することができます:

cd example
iex -S mix

このように iex を立ち上げると、アプリケーションと依存関係が現在の実行環境へ読み込まれます。

コンパイル

mixは賢く、必要に応じてコードの変更をコンパイルしてくれますが、それでもプロジェクトを明示的にコンパイルする必要があるかもしれません。この項ではプロジェクトのコンパイル方法と、コンパイルが何をしているのかについて扱います。

mixプロジェクトをコンパイルするにはプロジェクト直下のディレクトリでただmix compileを実行するだけで済みます。

注記プロジェクトのmix taskはプロジェクトのrootディレクトリからのみ実行可能です。rootディレクトリ以外から実行する場合は、グローバルmix taskのみが実行可能です。

mix compile

私達のプロジェクトはまだ中身があまりないので出力結果はそれほど面白くありませんが、無事に完了するはずです:

Compiled lib/example.ex
Generated example app

プロジェクトをコンパイルする際、mixは生成物のために _build ディレクトリを作ります。 _build 内部を覗けば、コンパイルされたアプリケーションが example.app として見えるでしょう。

依存関係を管理する

私達のプロジェクトはまだ依存関係を持っていませんが、それもすぐでしょうから、次へと進み、依存関係を定義し取り込む方法を扱います。

新しい依存関係を追加するには、まずそれを mix.exsdeps 内に追加する必要があります。依存関係のリストは2つの必須な値(パッケージ名のアトムと、バージョンを表す文字列)と1つの任意的な値(オプション)を持つタプルで成り立ちます。

実例として、phoenix_slimのようなプロジェクトの依存関係を見てみましょう:

def deps do
  [
    {:phoenix, "~> 1.1 or ~> 1.2"},
    {:phoenix_html, "~> 2.3"},
    {:cowboy, "~> 1.0", only: [:dev, :test]},
    {:slime, "~> 0.14"}
  ]
end

上記を見てお気づきかと思いますが、 cowboy の依存は開発時とテスト時にのみ必要です。

依存関係を定義したら、あとは最後の一歩、依存しているパッケージの取り込みです。これはbundle installに似たものです:

mix deps.get

完了です!プロジェクトの依存関係を定義し、取り込みを行いました。これで、しかるべき時に依存関係を追加する準備ができました。

環境

mixは、Bundlerにとても似て、様々な環境に対応しています。mixは最初から3つの環境で動作するように構成されています:

現在の環境は Mix.env で取得することができます。期待される通り、この環境は MIX_ENV 環境変数によって変更することができます:

MIX_ENV=prod mix compile
間違いを報告したい、あるいはこのレッスンに貢献したい? このレッスンをGitHubで編集しよう!