簡體   English   中英

如何獲取每個環境的Elixir依賴關系?

[英]How to fetch Elixir dependencies per environment?

有多種安裝Elixir依賴項的方法。 我想知道在以下情況下會發生什么:

1。

mix deps.get --only prod

那么究竟獲取了哪些依賴關系?

2。

defp deps do
  [
    {:credo, "~> 0.8", only: ~w(dev)a, runtime: false},
  ]
end

only選擇如何影響特定的依存關系?

3。

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只有在您的環境為devMIX_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM