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

Mix

在更深入了解 Elixir 之前,我们必须先学习 mix。如果你熟悉 Ruby 的话,mix 就是 Bundler,RubyGems 和 Rake 的结合。mix 对于开发 Elixir 至关重要,我们在这篇课程只会介绍它的部分特性。要查看 Mix 在当前环境中提供的所有内容,请运行 mix help

直到现在,我们还一直用 iex 和 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 启动的时候会把你的应用和依赖都加载到当前环境(这样你可以直接在 iex 中导入和运行编译好的代码)。

编译

Mix 很智能,能够在需要的时候自动编译你的改动,不过有时候还是要手动编译项目。这个部分,我们就讲讲如何编译项目,以及编译的时候都做了什么。

只要在项目的根目录运行 mix compile 命令,就能编译我们的项目:
注意:项目的混合任务只能从项目根目录中获得,否则只有全局的 Mix 任务可用

mix compile

因为我们的项目没有多少内容,尽管编译成功,但是并没有很多内容输出:

Compiled lib/example.ex
Generated example app

当我们编译项目时,mix 会自动创建一个 _build 目录,查看 _build 目录,你会看到已经编译好的文件: example.app

管理依赖

我们的项目现在还没有任何依赖,不过很快就会有了。所以我们就提前讲讲如何定义依赖以及获取依赖。

要增加新的依赖,我们首先要把它添加到 mix.exs 文件的 deps 部分,所有的依赖组成了一个列表,每个项是一个二元元组:第一个值是原子表示的包名称,第二个是包的版本号,版本号可以省略。

我们找了一个有依赖的项目 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

好了!我们已经定义并且获取了项目的依赖。这样有新依赖的时候,我们就知道怎么去处理了。

环境管理

和 Bundler 很相似,mix 也支持不同的环境。默认情况下,开箱即用的 mix 有三种配置环境:

可以从 Mix.env 变量中获取当前的环境,而且环境也可以通过 MIX_ENV 环境变量来配置:

MIX_ENV=prod mix compile
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!