【问题标题】:How to fetch Elixir dependencies per environment?如何获取每个环境的 Elixir 依赖项?
【发布时间】:2017-06-16 23:09:25
【问题描述】:

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

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


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

【问题讨论】:

    标签: hex elixir


    【解决方案1】:

    当你写这个时:

    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。 如果您在任何其他环境(例如 prod)中,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 分离已经被采取照顾:)

    【讨论】:

    • 这个问题与凤凰无关。 Phoenix 是一个在 Elixir 中构建 Web 应用程序的框架。 Phoenix 不安装任何东西。
    • 对不起,更新这个,我太喜欢凤凰了;)
    • 感谢您指出这一点,我的意思是mix。答案现在适用,你不觉得吗? :)
    【解决方案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 信条包仅应在开发环境中使用。如果不包含:only 选项,则该包将在所有环境中使用。

    $ mix deps.get --only prod 只会检索与生产环境相关的包。在前面的示例中,不会检索 credo 包,因为您告诉 mix credo 只能在 dev 环境中使用。

    【讨论】:

    • 您定义了两次deps(:dev),我想您的意思是第二次定义deps(:prod)?否则,我同意你的看法:)
    • 我确实做到了。这就是我得到的复制/粘贴以节省一点时间:(。
    • 那么会发生什么:MIX_ENV=test mix deps.get --only prod?是否会获取 testdevelopment 依赖项?
    • 不,只有 prod 依赖项。
    • 您可以只交换特定的依赖项选项,而不是交换每个 env 的所有依赖项:defp opts_for_pollution(env) when env in [:dev, :test], do: [path: "../pollution"] defp opts_for_pollution(_), do: [],就像 @josevalim 在这里所做的那样:github.com/elixir-lang/elixir/issues/6345
    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2017-12-28
    相关资源
    最近更新 更多