仅获取产品组合依赖项

get only prod mix dependencies

拥有:

  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

但是会崩溃 :dev 像 credo 这样的依赖项。

我可以只检索 :prod 依赖项吗?因为只过滤掉:[:dev, :test], runtime: false 有点棘手

首先,关于您收到错误的原因。在您的示例中,此调用

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

returns 是 List 而不是 Keyword List ,这是下一行所期望的

|> Keyword.keys()

这就是为什么它会崩溃的原因

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

正如您所指出的,它特别针对那些未由两项元组描述的依赖项崩溃,因此不代表 Keyword List.

的元素

现在进入你问题的核心。正如您所指出的,您可以手动过滤 deps,但像这样的场景使它变得相当乏味:

{: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

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