[英]How to fetch Elixir dependencies per environment?
有多种安装Elixir依赖项的方法。 我想知道在以下情况下会发生什么:
mix deps.get --only prod
那么究竟获取了哪些依赖关系?
defp deps do
[
{:credo, "~> 0.8", only: ~w(dev)a, runtime: false},
]
end
only
选择如何影响特定的依存关系?
def project do
[
# ...
deps: deps(Mix.env()),
]
end
如果我们这样指定依赖项,有什么区别?
我对于何时使用有关定义依赖项的内容感到有些困惑。
当你写这个:
mix deps.get --only prod
它将获取prod环境的所有依赖项,即没有only
选项的依赖项,以及指定了only
选项并包含:prod
依赖项(例如{:some_dep, "~> 0.8", only: [:prod]}
)
当你写这个:
defp deps do
[
{:some_dep, "~> 0.8"}
]
end
这告诉mix在运行的任何环境中安装some_dep
。
当你写这个:
defp deps do
[
{:another_dep, "~> 0.8", only: [:dev]}
]
end
它告诉mix只有在您的环境为dev
( MIX_ENV=dev
)时才安装another_dep
。 如果您在任何其他环境(例如产品)中, mix deps.get
只会忽略another_dep
而不安装它。
写这个:
def project do
[
# ...
deps: deps(Mix.env()),
]
end
将导致** (CompileError) mix.exs:13: undefined function deps/1
因为在mix.exs
,仅定义了deps/0
。 现在,您可能会告诉我为什么不实现deps(:dev)
, deps(:prod)
等等...好吧,如果您阅读了我之前解释的内容,您会发现它毫无意义,因为每个deps的分隔环境已经照顾好了:)
我将以相反的顺序解决这些问题。
如果在多个环境中使用依赖关系,则使用deps(Mix.env)
将强制您多次指定每个依赖关系。 遵循以下原则
def deps(:dev) do
[
{:ecto, "~> 2.1"}
{:credo, "~> 0.8", runtime: false}
]
end
def deps(:test) do
[
{:ecto, "~> 2.1"}
]
end
我承认,我什至不知道这是否行得通,但是如果您仅指定:only
选项,那么这会为已经为您处理的内容添加太多代码。
使用:only
允许您指定在哪个环境中使用依赖项。在您的示例中, {:credo, "~> 0.8", only: [:dev], runtime: false}
您告诉混合credo软件包应该仅在开发环境中使用。 如果不包括:only
选项,则该软件包将在所有环境中使用。
$ mix deps.get --only prod
将仅检索与生产环境相关的软件包。 在前面的示例中,将不会检索credo软件包,因为您告诉mix,credo仅应在dev环境中使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.