【问题标题】:get only prod mix dependencies仅获取产品组合依赖项
【发布时间】:2019-01-14 14:45:52
【问题描述】:

拥有:

  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 有点棘手

【问题讨论】:

  • 将您的应用名称传递给Application.ensure_all_started 不起作用吗?启动您的应用程序将启动所有未启动的依赖项。
  • 这适用于我的应用未运行的混合任务
  • 类似 stackoverflow.com/questions/35706320/… 的东西,但我添加了所有依赖项,因为我有很多强制依赖项

标签: elixir elixir-mix


【解决方案1】:

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

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 的元素。


现在回到您问题的核心。正如您所指出的,您可以手动过滤 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],但可以对其进行重新设计以避免这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多