首页 > 解决方案 > 仅获取产品组合依赖项

问题描述

有:

  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但是会因信条之类的依赖项而崩溃。

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

标签: elixirelixir-mix

解决方案


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

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

返回 aList而不是 aKeyword List这是下一行所期望的

|> Keyword.keys()

这就是为什么它与可以假设的崩溃

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

正如您所指出的,它专门针对那些未由两项元组描述的依赖项而崩溃,因此不代表 a 的元素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],但可以对其进行重新设计以避免这种情况。


推荐阅读