仅获取产品混合依赖项

时间:2018-08-07 13:27:59

标签: elixir mix

具有:

  defp deps do
    [
      {:poison, "~> 3.0"},
      {:credo, "~> 0.10.0", only: [:dev, :test], runtime: false}
    ]
  end

我正在这样做,以确保所有依赖项都已启动:

MixProject.project()
|> Keyword.get(:deps)
|> Keyword.keys()
|> Enum.each(fn dep ->
  Application.ensure_all_started(dep)
end

但是由于诸如credo之类的:dev依赖项而崩溃。

我只能检索:prod依赖项吗?由于仅过滤:[:dev, :test], runtime: false有点棘手

1 个答案:

答案 0 :(得分:3)

首先,说明出现错误的原因。在您的示例中,该调用

MixProject.project()
|> Keyword.get(:deps)

返回List而不是Keyword List,这是下一行期望的结果

|> Keyword.keys()

这就是为什么它崩溃的原因可以假定为

** (FunctionClauseError) no function clause matching in anonymous fn/1 in Keyword.keys/1

正如您所指出的,它专门针对没有由两个项目元组描述的那些依赖项而崩溃,因此不代表Keyword List的元素。


现在是您问题的核心。正如您所指出的,您可以手动过滤dep,但是类似这样的情况使它变得很乏味:

{:dep_one, "~> 1.0"},
{:dep_two, "~> 1.0", only: [:prod]},
{:dep_three, "~> 1.0", except: [:dev, :test]}

另一种方法是根据环境动态构建deps列表,例如:

defp deps do
  [
    # universal deps go here
  ] ++ deps(Mix.env)
end

defp deps(env) when env == :dev do
  [
    # dev-only deps
  ]
end
defp deps(env) when env == :test do
  [
    # test-only deps
  ]
end
defp deps(env) when env == :prod do
  [
    # prod-only deps
  ]
end

这种简单的实现方式需要为多个环境(例如only: [:dev, :test])定义的deps重复定义,但是可以避免这种情况。