定义和操作 Mix 项目。
Mix 项目是通过在模块中调用 use Mix.Project
来定义的,通常放置在 mix.exs
文件中:
defmodule MyApp.MixProject do
use Mix.Project
def project do
[
app: :my_app,
version: "1.0.0"
]
end
end
当你使用
use Mix.Project
时,它告诉Mix
一个新项目已被定义,因此所有Mix
任务都会使用你的模块作为起点。
配置
为了配置 Mix,使用 use Mix.Project
的模块需要导出一个 project/0
函数,该函数返回一个关键字列表,代表项目的配置。
这个配置可以通过 Mix.Project.config/0
读取。注意,如果没有定义项目, config/0
也不会失败;这使得许多 Mix 任务在没有项目的情况下也能工作。
调用
Mix.Project.config/0
之前,你需要先使用iex -S mix
。
如果一个任务需要项目被定义,或者需要访问项目中的特定函数,可以调用 Mix.Project.get!/0
,如果项目没有定义,它会抛出 Mix.NoProjectError
异常。
project/0
返回的选项列表并不固定,因为许多 Mix 任务都会从这个配置列表中读取自定义的选项。
以下是一些广泛使用的选项:
:build_per_environment
- 如果为true
,编译时会针对每个环境(dev
,test
,prod
)进行构建。如果为false
,不管是哪个环境,编译结果都会放在_build/shared
中。默认为true
。:aliases
- 任务别名列表。更多信息,查看Mix
模块文档中的 “Aliases” 部分。默认为[]
。:config_path
- 主配置文件路径。默认为"config/config.exs"
。:deps
- 该项目的依赖列表。参考Mix.Tasks.Deps
任务的文档以获取更多信息。默认为[]
。:deps_path
- 存储依赖的目录。默认为"deps"
。:lockfile
-mix deps.*
系列任务使用的 lock 文件名称,用来固化依赖版本。默认为"mix.lock"
。
Mix 任务自定义的配置也是从 def project
中获取的。
注意,不同的任务可能共享相同的配置选项。例如, :erlc_paths
配置就同时被 mix compile.erlang
、 mix compile.yecc
和其他任务使用。
CLI 配置
Mix 最常见的调用方式是从命令行调用。为此,你可以定义一个 cli/0
函数,定制从命令行执行的默认值。例如:
def cli do
[
default_task: "phx.server",
preferred_envs: [docs: :docs]
]
end
上述示例将默认任务( iex -S mix
和 mix
)设置为 phx.server
。它还将 “mix docs” 任务的默认环境设置为 “docs”。
可用的 CLI 配置如下:
:default_env
- 当没有给定环境且没有设置MIX_ENV
时使用的默认环境。:default_target
- 当没有给定目标且没有设置MIX_TARGET
时使用的默认目标。:default_task
- 当没有给定任务时调用的默认任务。:preferred_envs
- 一个{task, env}
元组构成的关键字列表,其中task
是原子类型的任务名称(例如:"deps.get"
),env
是环境(例如:test
)。:preferred_targets
- 一个{task, target}
元组的关键字列表,其中task
是原子类型的任务名称(例如:test
),target
是目标(例如:host
)。
Erlang 项目
Mix 可以用来管理没有任何 Elixir 代码的 Erlang 项目。为了确保 Mix 任务正确地管理 Erlang 项目, project/0
返回的配置中必须包含 language: :erlang
。这个设置还确保 Elixir 不会被作为依赖添加到生成的 .app
文件或使用 mix escript.build
生成的 escript 等文件中。
调用这个模块
这个模块包含许多返回项目信息和元数据的函数。然而,由于 Mix 不会包含在发布版中,我们建议只在 Mix 任务中使用这个模块中的函数。如果你需要配置你自己的应用,请使用应用环境。例如,不要这样做:
def some_config do
Mix.Project.config()[:some_config]
end
也不要这样做:
@some_config Mix.Project.config()[:some_config]
而是应该这样:
def some_config do
Application.get_env(:my_app, :some_config)
end
或者这样:
@some_config Application.compile_env(:my_app, :some_config)