繁体   English   中英

如何获取每个环境的Elixir依赖关系?

[英]How to fetch Elixir dependencies per environment?

有多种安装Elixir依赖项的方法。 我想知道在以下情况下会发生什么:

1。

mix deps.get --only prod

那么究竟获取了哪些依赖关系?

2。

defp deps do
  [
    {:credo, "~> 0.8", only: ~w(dev)a, runtime: false},
  ]
end

only选择如何影响特定的依存关系?

3。

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只有在您的环境为devMIX_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM