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

时间:2017-06-16 14:35:09

标签: hex elixir

有多种方法可以安装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

如果我们指定那样的依赖项有什么区别?

我在使用有关定义依赖关系的内容时感到困惑。

2 个答案:

答案 0 :(得分:2)

我将以相反的顺序解决这些问题。

使用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}告诉mix,信条包应该只在dev环境中使用。如果您不包含:only选项,则该程序包将在所有环境中使用。

$ mix deps.get --only prod只会检索与生产环境相关的包。从前面的示例中,将不会检索信条包,因为您告诉mix,信条只应在开发环境中使用。

答案 1 :(得分:1)

当你这样写:

mix deps.get --only prod

它将获取prod环境的所有依赖项,即没有only选项的依赖项,以及指定only选项且包含:prod的依赖项(例如{{ 1}})

当你这样写:

{:some_dep, "~> 0.8", only: [:prod]}

告诉mix在{strong>任何环境中安装defp deps do [ {:some_dep, "~> 0.8"} ] end

当你这样写:

some_dep

只有当您的环境为defp deps do [ {:another_dep, "~> 0.8", only: [:dev]} ] end another_dep)时,它才会告诉mix安装dev。 如果您处于任何其他环境(例如产品),MIX_ENV=dev将忽略mix deps.get并且无法安装它。

写这个:

another_dep

将导致def project do [ # ... deps: deps(Mix.env()), ] end ,因为在** (CompileError) mix.exs:13: undefined function deps/1中,只定义了mix.exs。现在你可以告诉我为什么不实现deps/0deps(:dev)等等......好吧,如果你读过我之前解释的内容,你会发现它没有意义,因为deps分离对于每个环境已经处理好了:))