[英]How to fetch Elixir dependencies per environment?
有多種安裝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
如果我們這樣指定依賴項,有什么區別?
我對於何時使用有關定義依賴項的內容感到有些困惑。
當你寫這個:
mix deps.get --only prod
它將獲取prod環境的所有依賴項,即沒有only
選項的依賴項,以及指定了only
選項並包含:prod
依賴項(例如{:some_dep, "~> 0.8", only: [:prod]}
)
當你寫這個:
defp deps do
[
{:some_dep, "~> 0.8"}
]
end
這告訴mix在運行的任何環境中安裝some_dep
。
當你寫這個:
defp deps do
[
{:another_dep, "~> 0.8", only: [:dev]}
]
end
它告訴mix只有在您的環境為dev
( MIX_ENV=dev
)時才安裝another_dep
。 如果您在任何其他環境(例如產品)中, 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(:prod)
等等...好吧,如果您閱讀了我之前解釋的內容,您會發現它毫無意義,因為每個deps的分隔環境已經照顧好了:)
我將以相反的順序解決這些問題。
如果在多個環境中使用依賴關系,則使用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}
您告訴混合credo軟件包應該僅在開發環境中使用。 如果不包括:only
選項,則該軟件包將在所有環境中使用。
$ mix deps.get --only prod
將僅檢索與生產環境相關的軟件包。 在前面的示例中,將不會檢索credo軟件包,因為您告訴mix,credo僅應在dev環境中使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.