檢視原始碼 Mix.Project (Mix v1.16.2)

定義和操作 Mix 專案。

在模組中呼叫 use Mix.Project 來定義 Mix 專案,通常放置在 mix.exs

defmodule MyApp.MixProject do
  use Mix.Project

  def project do
    [
      app: :my_app,
      version: "1.0.0"
    ]
  end
end

use Mix.Project

當您 use Mix.Project 時,它會通知 Mix 已定義一個新專案,因此所有 Mix 任務都使用您的模組作為起點。

設定

為了設定 Mix,use Mix.Project 的模組應匯出一個 project/0 函式,傳回代表專案設定的關鍵字清單。

可以使用 Mix.Project.config/0 讀取此設定。請注意,如果專案未定義,config/0 也不會失敗;這允許許多 Mix 任務在沒有專案的情況下工作。

如果任務需要定義專案或需要存取專案中的特殊函式,任務可以呼叫 Mix.Project.get!/0,如果專案未定義,它會傳回 Mix.NoProjectError

沒有 project/0 可以傳回的所有選項的完整清單,因為許多 Mix 任務定義了他們從此設定中讀取的選項。例如,查看 Mix.Tasks.Compile 任務文件中的「設定」區段。

以下是一些不只一個 Mix 任務使用的選項(因此會在此處記錄)

  • :build_per_environment - 如果為 true,建置將會是每個環境。如果為 false,建置將會進入 _build/shared,而與 Mix 環境無關。預設為 true

  • :aliases - 任務別名的清單。更多資訊,請查看 Mix 模組文件中的「別名」區段。預設為 []

  • :config_path - 代表主設定檔路徑的字串。更多資訊,請查看 config_files/0。預設為 "config/config.exs"

  • :deps - 此專案的相依性清單。更多資訊,請參閱 Mix.Tasks.Deps 任務文件。預設為 []

  • :deps_path - 儲存相依項目的目錄。另請參閱 deps_path/1。預設為 "deps"

  • :lockfile - mix deps.* 任務系列使用的鎖定檔名稱。預設為 "mix.lock"

Mix 任務可能需要在 def project 內部進行自己的組態。例如,檢查 Mix.Tasks.Compile 任務和所有特定編譯器任務(例如 Mix.Tasks.Compile.ElixirMix.Tasks.Compile.Erlang)。

請注意,不同的任務可能共用相同的組態選項。例如,:erlc_paths 組態由 mix compile.erlangmix compile.yecc 和其他任務使用。

CLI 組態

Mix 最常從命令列呼叫。為此,您可以在從 CLI 執行時自訂預設值,定義特定的 cli/0 函式。例如

def cli do
  [
    default_task: "phx.server",
    preferred_envs: [docs: :docs]
  ]
end

上面的範例將預設任務(由 iex -S mixmix 使用)設定為 phx.server。它也將「mix docs」任務的預設環境設定為「docs」。

可以使用下列 CLI 組態

  • :default_env - 當未提供任何環境且 MIX_ENV 未設定時,要使用的預設環境

  • :default_target - 當未提供任何目標且 MIX_TARGET 未設定時,要使用的預設目標

  • :default_task - 當未提供任何任務時,要呼叫的預設任務

  • :preferred_envs - {task, env} 叢集的關鍵字清單,其中 task 是任務名稱(以原子表示,例如 :"deps.get"),而 env 是偏好的環境(例如 :test

  • :preferred_targets - {task, target} 叢集的關鍵字清單,其中 task 是任務名稱(以原子表示,例如 :test),而 target 是偏好的目標(例如 :host

Erlang 專案

Mix 可用於管理沒有任何 Elixir 程式碼的 Erlang 專案。為確保 Mix 任務正確運作於 Erlang 專案,language: :erlang 必須是 project/0 所回傳組態的一部分。此設定也會確保 Elixir 沒有新增為 .app 檔案所產生的相依性,或使用 mix escript.build 所產生的 escript,等等。

呼叫此模組

此模組包含許多會回傳專案資訊和元資料的函式。然而,由於 Mix 並未包含或組態於發行版本中,我們建議僅在 Mix 任務中使用此模組的函式。如果您需要組態您自己的應用程式,請考慮改用應用程式環境。例如,不要執行下列動作

def some_config do
  Mix.Project.config()[:some_config]
end

也不要執行下列動作

@some_config Mix.Project.config()[:some_config]

請改為執行下列動作

def some_config do
  Application.get_env(:my_app, :some_config)
end

或執行下列動作

@some_config Application.compile_env(:my_app, :some_config)

摘要

函式

回傳組建中的應用程式路徑。

回傳一個包含傘式架構子應用程式路徑的對應。

回傳給定專案的組建路徑。

為給定的應用程式組建專案結構。

清除目前環境的相依性。

回傳給定專案編譯的路徑。

回傳專案組態。

回傳此專案的專案組態檔案清單。

回傳組態檔案的最新修改時間。

回傳儲存通訊協定合併的路徑。

回傳所有相依性應用程式名稱。

回傳給定專案的相依性儲存路徑。

回傳所有相依性的完整路徑,以對應形式呈現。

回傳所有相依性的 SCM,以對應形式呈現。

回傳所有相依性的相依性,以對應形式呈現。

確保給定專案的專案結構存在。

如果有一個專案,則擷取目前的專案。

get/0 相同,但如果沒有目前的專案,則會引發例外狀況。

在給定的專案內執行給定的 fun

傳回儲存清單的路徑。

如果有的話,傳回定義父層傘狀專案的檔案路徑。

傳回定義目前專案的檔案路徑。

如果 config 是傘狀專案的組態,則傳回 true

函式

連結至這個函式

app_path(config \\ config())

檢視原始碼
@spec app_path(keyword()) :: Path.t()

回傳組建中的應用程式路徑。

傳回的路徑將會展開。

範例

如果你的專案定義了應用程式 my_app

Mix.Project.app_path()
#=> "/path/to/project/_build/shared/lib/my_app"
連結至這個函式

apps_paths(config \\ config())

檢視原始碼 (自 1.4.0 起)
@spec apps_paths(keyword()) :: %{optional(atom()) => Path.t()} | nil

回傳一個包含傘式架構子應用程式路徑的對應。

這些路徑基於 :apps_path:apps 組態。

如果給定的專案組態識別出一個傘狀專案,傳回值會是 app => path 的對應,其中 app 是傘狀專案的子應用程式,而 path 是相對於傘狀專案根目錄的路徑。

如果給定的專案組態沒有識別出一個傘狀專案,則會傳回 nil

範例

Mix.Project.apps_paths()
#=> %{my_app1: "apps/my_app1", my_app2: "apps/my_app2"}
連結至這個函式

build_path(config \\ config())

檢視原始碼
@spec build_path(keyword()) :: Path.t()

回傳給定專案的組建路徑。

建置路徑基於 :build_path 組態 (預設為 "_build") 和一個子目錄建置。子目錄基於兩個因素建置

  • 如果設定了 :build_per_environment,子目錄會是 Mix.env/0 的值 (可透過 MIX_ENV 設定)。否則會設定為 "shared"。

  • 如果設定了 Mix.target/0 (通常透過 MIX_TARGET 環境變數),它會用作子目錄的前置詞。

最後,環境變數 MIX_BUILD_ROOTMIX_BUILD_PATH 可用於變更此函式的結果。 MIX_BUILD_ROOT 僅覆寫根目錄 "_build",同時保持子目錄不變。這可能有助於出於快取原因變更它,通常是在持續整合 (CI) 期間。 MIX_BUILD_PATH 完全覆寫建置路徑,且通常由呼叫 mix CLI 的其他建置工具使用。

命名差異

理想情況下,組態選項 :build_path 會稱為 :build_root,因為它會完全反映環境變數。不過,它的名稱已保留,以維持向後相容性。

範例

Mix.Project.build_path()
#=> "/path/to/project/_build/shared"

如果 :build_per_environment 設為 true,它會為每個環境建立新的建置

Mix.env()
#=> :dev
Mix.Project.build_path()
#=> "/path/to/project/_build/dev"
連結至這個函式

build_structure(config \\ config(), opts \\ [])

檢視原始碼
@spec build_structure(keyword(), keyword()) :: :ok

為給定的應用程式組建專案結構。

選項

  • :symlink_ebin - 連結 ebin,而不是複製它
連結至這個函式

clear_deps_cache()

檢視原始碼 (自 1.7.0 起)
@spec clear_deps_cache() :: :ok

清除目前環境的相依性。

當相依項需要因為全域狀態變更而重新載入時很有用。

例如,Nerves 使用此函式在更新系統環境後強制重新載入所有相依項。它大致如下

  1. Nerves 擷取所有相依項,並尋找系統特定相依項
  2. 找到系統特定相依項後,它會與環境變數一起載入它
  3. 然後,Nerves 清除快取,強制重新載入相依項
  4. 相依項會再次載入,現在使用更新的環境環境
連結至這個函式

compile_path(config \\ config())

檢視原始碼
@spec compile_path(keyword()) :: Path.t()

回傳給定專案編譯的路徑。

如果未提供組態,則會使用目前專案的組態。

傳回的路徑將會展開。

範例

如果你的專案定義了應用程式 my_app

Mix.Project.compile_path()
#=> "/path/to/project/_build/dev/lib/my_app/ebin"
@spec config() :: keyword()

回傳專案組態。

如果未定義專案,它仍會傳回具有預設值的關鍵字清單。這允許多個 Mix 工作在不需要基礎專案的情況下運作。

請注意,此組態在專案推送到堆疊後會快取。多次呼叫它不會導致它重新運算。

請勿使用 Mix.Project.config/0 尋找執行時期組態。僅使用它來組態專案的各個面向 (例如編譯目錄),而不是應用程式執行時期。

@spec config_files() :: [Path.t()]

回傳此專案的專案組態檔案清單。

此函式通常用於編譯任務,以在這些組態檔變更時觸發完整重新編譯。

它會傳回鎖定清單,以及 config 目錄中所有不以句點開頭的組態檔(例如 .my_config.exs)。

注意:在 Elixir v1.13.0 之前,mix.exs 檔也包含在組態檔中,但自此之後,它已移至名為 project_file/0 的專屬函式。

連結至這個函式

config_mtime()

檢視原始碼 (自 1.7.0 起)
@spec config_mtime() :: posix_mtime when posix_mtime: integer()

回傳組態檔案的最新修改時間。

此函式通常用於編譯任務,以在這些組態檔變更時觸發完整重新編譯。因此,會快取 mtime 以避免檔案系統查詢。

注意:在 Elixir v1.13.0 之前,mix.exs 檔也包含在 mtime 中,但現在已不再包含。您可以呼叫 project_file/0 來計算其修改日期。

連結至這個函式

consolidation_path(config \\ config())

檢視原始碼
@spec consolidation_path(keyword()) :: Path.t()

回傳儲存通訊協定合併的路徑。

傳回的路徑將會展開。

範例

如果你的專案定義了應用程式 my_app

Mix.Project.consolidation_path()
#=> "/path/to/project/_build/dev/lib/my_app/consolidated"

在傘狀結構中

Mix.Project.consolidation_path()
#=> "/path/to/project/_build/dev/consolidated"
連結至這個函式

deps_apps()

檢視原始碼 (自 1.11.0 起)
@spec deps_apps() :: [atom()]

回傳所有相依性應用程式名稱。

保證傳回的順序已排序,以進行適當的相依性解析。例如,如果 A 相依於 B,則 B 會列在 A 之前。

連結至這個函式

deps_path(config \\ config())

檢視原始碼
@spec deps_path(keyword()) :: Path.t()

回傳給定專案的相依性儲存路徑。

如果未提供組態,則會使用目前專案的組態。

傳回的路徑將會展開。

範例

Mix.Project.deps_path()
#=> "/path/to/project/deps"
@spec deps_paths(keyword()) :: %{optional(atom()) => Path.t()}

回傳所有相依性的完整路徑,以對應形式呈現。

選項

  • :depth - 僅傳回深度層級的相依性,深度為 1 時,僅會傳回頂層相依性
  • :parents - 從指定的父項而非應用程式根目錄開始相依性遍歷

範例

Mix.Project.deps_paths()
#=> %{foo: "deps/foo", bar: "custom/path/dep"}
連結至這個函式

deps_scms(opts \\ [])

檢視原始碼 (自 1.10.0 起)
@spec deps_scms(keyword()) :: %{optional(atom()) => Mix.SCM.t()}

回傳所有相依性的 SCM,以對應形式呈現。

請參閱 Mix.SCM 模組文件,以進一步了解 SCM。

選項

  • :depth - 僅傳回深度層級的相依性,深度為 1 時,僅會傳回頂層相依性
  • :parents - 從指定的父項而非應用程式根目錄開始相依性遍歷

範例

Mix.Project.deps_scms()
#=> %{foo: Mix.SCM.Path, bar: Mix.SCM.Git}
連結至這個函式

deps_tree(opts \\ [])

檢視原始碼 (自 1.15.0 起)
@spec deps_tree(keyword()) :: %{optional(atom()) => [atom()]}

回傳所有相依性的相依性,以對應形式呈現。

選項

  • :depth - 僅傳回深度層級的相依性,深度為 1 時,僅會傳回頂層相依性
  • :parents - 從指定的父項而非應用程式根目錄開始相依性遍歷

範例

Mix.Project.deps_tree()
#=> %{foo: [:bar, :baz], bar: [], baz: []}
連結至這個函式

ensure_structure(config \\ config(), opts \\ [])

檢視原始碼
@spec ensure_structure(keyword(), keyword()) :: :ok

確保給定專案的專案結構存在。

如果存在,則為 no-op。否則,將會建置。

opts 是可以傳遞給 build_structure/2 的相同選項。

@spec get() :: module() | nil

如果有一個專案,則擷取目前的專案。

如果沒有目前的專案,則傳回 nil。這可能會發生在目前目錄中沒有 mix.exs 的情況。

如果您預期定義專案,亦即這是目前任務的要求,您應該改為呼叫 get!/0

@spec get!() :: module()

get/0 相同,但如果沒有目前的專案,則會引發例外狀況。

這通常是由需要專案的其他功能的任務呼叫。由於此類任務通常取決於定義的專案,因此此功能會在沒有可用專案的情況下引發 Mix.NoProjectError 例外。

連結至這個函式

in_project(app, path, post_config \\ [], fun)

檢視原始碼
@spec in_project(atom(), Path.t(), keyword(), (module() -> result)) :: result
when result: term()

在給定的專案內執行給定的 fun

此功能會變更目前工作目錄,並將指定目錄中的專案載入到專案堆疊中。

可以傳遞 post_config,它會合併到專案組態中。

fun 會呼叫指定 Mix.Project 的模組名稱。此功能的傳回值為 fun 的傳回值。

範例

Mix.Project.in_project(:my_app, "/path/to/my_app", fn module ->
  "Mix project is: #{inspect(module)}"
end)
#=> "Mix project is: MyApp.MixProject"
連結至這個函式

load_paths(config \\ config())

檢視原始碼
此功能已棄用。請改用 Mix.Project.compile_path/1。
連結至這個函式

manifest_path(config \\ config())

檢視原始碼
@spec manifest_path(keyword()) :: Path.t()

傳回儲存清單的路徑。

預設情況下,它們儲存在建置目錄內的應用程式路徑中。Umbrella 應用程式會將清單路徑設定為建置目錄的根目錄。目錄可能會在未來的版本中變更。

傳回的路徑將會展開。

範例

如果你的專案定義了應用程式 my_app

Mix.Project.manifest_path()
#=> "/path/to/project/_build/shared/lib/my_app/.mix"
連結至這個函式

parent_umbrella_project_file()

檢視原始碼 (自 1.15.0 起)
@spec parent_umbrella_project_file() :: binary() | nil

如果有的話,傳回定義父層傘狀專案的檔案路徑。

大部分時間,它會指向 mix.exs 檔案。如果不在專案內或不在傘狀專案內,則傳回 nil

連結至這個函式

project_file()

檢視原始碼 (自 1.13.0 起)
@spec project_file() :: binary() | nil

傳回定義目前專案的檔案路徑。

大部分時間,它會指向 mix.exs 檔案。如果不在專案內,則傳回 nil

連結至這個函式

umbrella?(config \\ config())

檢視原始碼
@spec umbrella?(keyword()) :: boolean()

如果 config 是傘狀專案的組態,則傳回 true

當不帶任何引數呼叫時,會告知目前的專案是否為傘狀專案。