具有:
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
有点棘手
答案 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重复定义,但是可以避免这种情况。