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

Kam*_*nek 5 hex elixir

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

1.

mix deps.get --only prod
Run Code Online (Sandbox Code Playgroud)

那么到底要获取什么依赖项呢?

2.

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

选项如何only影响特定的依赖项?

3.

def project do
  [
    # ...
    deps: deps(Mix.env()),
  ]
end
Run Code Online (Sandbox Code Playgroud)

如果我们这样指定依赖关系有什么区别?


我有点困惑何时使用定义依赖项的内容。

Bac*_*irC 5

当你写下这个:

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 分离已经被处理好:)


Jus*_*ood 5

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

如果跨多个环境使用每个依赖项,则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 只能在开发环境中使用。