有多种方法可以安装Elixir依赖项。我想知道在下列情况下会发生什么:
mix deps.get --only prod
究竟是什么依赖于提取?
defp deps do
[
{:credo, "~> 0.8", only: ~w(dev)a, runtime: false},
]
end
only
选项如何影响特定的依赖关系?
def project do
[
# ...
deps: deps(Mix.env()),
]
end
如果我们指定那样的依赖项有什么区别?
我在使用有关定义依赖关系的内容时感到困惑。
答案 0 :(得分:2)
我将以相反的顺序解决这些问题。
使用deps(Mix.env)
会强制您多次指定每个依赖项(如果它们在多个环境中使用)。
def deps(:dev) do
[
{:ecto, "~> 2.1"}
{:credo, "~> 0.8", runtime: false}
]
end
def deps(:test) do
[
{:ecto, "~> 2.1"}
]
end
我承认我甚至不知道这是否有效,但是如果您只是指定:only
选项,这会为已经处理过的内容添加太多代码。
使用:only
可以指定应该使用依赖项的环境。在您的示例中,{:credo, "~> 0.8", only: [:dev], runtime: false}
告诉mix,信条包应该只在dev环境中使用。如果您不包含:only
选项,则该程序包将在所有环境中使用。
$ mix deps.get --only prod
只会检索与生产环境相关的包。从前面的示例中,将不会检索信条包,因为您告诉mix,信条只应在开发环境中使用。
答案 1 :(得分:1)
当你这样写:
mix deps.get --only prod
它将获取prod环境的所有依赖项,即没有only
选项的依赖项,以及指定only
选项且包含:prod
的依赖项(例如{{ 1}})
当你这样写:
{:some_dep, "~> 0.8", only: [:prod]}
告诉mix在{strong>任何环境中安装defp deps do
[
{:some_dep, "~> 0.8"}
]
end
。
当你这样写:
some_dep
只有当您的环境为defp deps do
[
{:another_dep, "~> 0.8", only: [:dev]}
]
end
(another_dep
)时,它才会告诉mix安装dev
。
如果您处于任何其他环境(例如产品),MIX_ENV=dev
将忽略mix deps.get
并且无法安装它。
写这个:
another_dep
将导致def project do
[
# ...
deps: deps(Mix.env()),
]
end
,因为在** (CompileError) mix.exs:13: undefined function deps/1
中,只定义了mix.exs
。现在你可以告诉我为什么不实现deps/0
,deps(:dev)
等等......好吧,如果你读过我之前解释的内容,你会发现它没有意义,因为deps分离对于每个环境已经处理好了:))