Имея:
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
немного сложен
это предназначено для смешанных задач, где мое приложение не запущено
Что-то вроде этого stackoverflow.com/questions/35706320/…, но я добавил все зависимости, потому что у меня много обязательных зависимостей
Во-первых, о причине, по которой вы получаете сообщение об ошибке. В вашем примере этот вызов
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_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]
, но ее можно было бы переработать, чтобы этого избежать.
Передача имени вашего приложения в
Application.ensure_all_started
не работает? Запуск вашего приложения запустит все ваши зависимости, если они не запущены.