有多种方法可以安装 Elixir 依赖项。我想知道以下情况会发生什么:
mix deps.get --only prod
Run Code Online (Sandbox Code Playgroud)
那么到底要获取什么依赖项呢?
defp deps do
[
{:credo, "~> 0.8", only: ~w(dev)a, runtime: false},
]
end
Run Code Online (Sandbox Code Playgroud)
选项如何only影响特定的依赖项?
def project do
[
# ...
deps: deps(Mix.env()),
]
end
Run Code Online (Sandbox Code Playgroud)
如果我们这样指定依赖关系有什么区别?
我有点困惑何时使用定义依赖项的内容。
当你写下这个:
mix deps.get --only prod
它将获取 prod 环境的所有依赖项,即没有only选项的依赖项,以及only指定选项并包含:prod(例如{:some_dep, "~> 0.8", only: [:prod]})的依赖项
当你写下这个:
defp deps do
[
{:some_dep, "~> 0.8"}
]
end
Run Code Online (Sandbox Code Playgroud)
some_dep这告诉 mix在它运行的任何环境中安装。
当你写下这个:
defp deps do
[
{:another_dep, "~> 0.8", only: [:dev]}
]
end
Run Code Online (Sandbox Code Playgroud)
another_dep它告诉 mix仅当您的环境是dev( ) 时才安装MIX_ENV=dev。如果您处于任何其他环境(例如 prod),mix deps.get将简单地忽略another_dep并且不会安装它。
写这个:
def project do
[
# ...
deps: deps(Mix.env()),
]
end
Run Code Online (Sandbox Code Playgroud)
会导致** (CompileError) mix.exs:13: undefined function deps/1因为在你的mix.exs, only中deps/0被定义。现在你可能会告诉我为什么不实现deps(:dev),deps(:prod)等等...好吧,如果你阅读了我之前解释的内容,你会发现这是毫无意义的,因为每个环境的 deps 分离已经被处理好:)
我将以相反的顺序解决这些问题。
如果跨多个环境使用每个依赖项,则usingdeps(Mix.env)会强制您多次指定它们。类似的东西
def deps(:dev) do
[
{:ecto, "~> 2.1"}
{:credo, "~> 0.8", runtime: false}
]
end
def deps(:test) do
[
{:ecto, "~> 2.1"}
]
end
Run Code Online (Sandbox Code Playgroud)
我承认我什至不知道这是否可行,但是如果您只是指定选项,那么这会为已经为您处理的内容添加太多代码:only。
使用:only允许您指定应在哪些环境中使用依赖项。在您的示例中,{:credo, "~> 0.8", only: [:dev], runtime: false}您告诉 mix credo 包只能在开发环境中使用。如果不包含该:only选项,则该包将在所有环境中使用。
$ mix deps.get --only prod只会检索与生产环境相关的包。在前面的示例中,不会检索 credo 包,因为您告诉 mix credo 只能在开发环境中使用。