檢視原始碼 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.Elixir
或 Mix.Tasks.Compile.Erlang
)。
請注意,不同的任務可能共用相同的組態選項。例如,:erlc_paths
組態由 mix compile.erlang
、mix compile.yecc
和其他任務使用。
CLI 組態
Mix 最常從命令列呼叫。為此,您可以在從 CLI 執行時自訂預設值,定義特定的 cli/0
函式。例如
def cli do
[
default_task: "phx.server",
preferred_envs: [docs: :docs]
]
end
上面的範例將預設任務(由 iex -S mix
和 mix
使用)設定為 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,以對應形式呈現。
回傳所有相依性的相依性,以對應形式呈現。
確保給定專案的專案結構存在。
如果有一個專案,則擷取目前的專案。
在給定的專案內執行給定的 fun
。
傳回儲存清單的路徑。
如果有的話,傳回定義父層傘狀專案的檔案路徑。
傳回定義目前專案的檔案路徑。
如果 config
是傘狀專案的組態,則傳回 true
。
函式
回傳組建中的應用程式路徑。
傳回的路徑將會展開。
範例
如果你的專案定義了應用程式 my_app
Mix.Project.app_path()
#=> "/path/to/project/_build/shared/lib/my_app"
回傳一個包含傘式架構子應用程式路徑的對應。
這些路徑基於 :apps_path
和 :apps
組態。
如果給定的專案組態識別出一個傘狀專案,傳回值會是 app => path
的對應,其中 app
是傘狀專案的子應用程式,而 path
是相對於傘狀專案根目錄的路徑。
如果給定的專案組態沒有識別出一個傘狀專案,則會傳回 nil
。
範例
Mix.Project.apps_paths()
#=> %{my_app1: "apps/my_app1", my_app2: "apps/my_app2"}
回傳給定專案的組建路徑。
建置路徑基於 :build_path
組態 (預設為 "_build"
) 和一個子目錄建置。子目錄基於兩個因素建置
如果設定了
:build_per_environment
,子目錄會是Mix.env/0
的值 (可透過MIX_ENV
設定)。否則會設定為 "shared"。如果設定了
Mix.target/0
(通常透過MIX_TARGET
環境變數),它會用作子目錄的前置詞。
最後,環境變數 MIX_BUILD_ROOT
和 MIX_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"
為給定的應用程式組建專案結構。
選項
:symlink_ebin
- 連結 ebin,而不是複製它
@spec clear_deps_cache() :: :ok
清除目前環境的相依性。
當相依項需要因為全域狀態變更而重新載入時很有用。
例如,Nerves 使用此函式在更新系統環境後強制重新載入所有相依項。它大致如下
- Nerves 擷取所有相依項,並尋找系統特定相依項
- 找到系統特定相依項後,它會與環境變數一起載入它
- 然後,Nerves 清除快取,強制重新載入相依項
- 相依項會再次載入,現在使用更新的環境環境
回傳給定專案編譯的路徑。
如果未提供組態,則會使用目前專案的組態。
傳回的路徑將會展開。
範例
如果你的專案定義了應用程式 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
的專屬函式。
@spec config_mtime() :: posix_mtime when posix_mtime: integer()
回傳組態檔案的最新修改時間。
此函式通常用於編譯任務,以在這些組態檔變更時觸發完整重新編譯。因此,會快取 mtime 以避免檔案系統查詢。
注意:在 Elixir v1.13.0 之前,mix.exs
檔也包含在 mtime 中,但現在已不再包含。您可以呼叫 project_file/0
來計算其修改日期。
回傳儲存通訊協定合併的路徑。
傳回的路徑將會展開。
範例
如果你的專案定義了應用程式 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"
@spec deps_apps() :: [atom()]
回傳所有相依性應用程式名稱。
保證傳回的順序已排序,以進行適當的相依性解析。例如,如果 A 相依於 B,則 B 會列在 A 之前。
回傳給定專案的相依性儲存路徑。
如果未提供組態,則會使用目前專案的組態。
傳回的路徑將會展開。
範例
Mix.Project.deps_path()
#=> "/path/to/project/deps"
回傳所有相依性的完整路徑,以對應形式呈現。
選項
:depth
- 僅傳回深度層級的相依性,深度為1
時,僅會傳回頂層相依性:parents
- 從指定的父項而非應用程式根目錄開始相依性遍歷
範例
Mix.Project.deps_paths()
#=> %{foo: "deps/foo", bar: "custom/path/dep"}
回傳所有相依性的 SCM,以對應形式呈現。
請參閱 Mix.SCM
模組文件,以進一步了解 SCM。
選項
:depth
- 僅傳回深度層級的相依性,深度為1
時,僅會傳回頂層相依性:parents
- 從指定的父項而非應用程式根目錄開始相依性遍歷
範例
Mix.Project.deps_scms()
#=> %{foo: Mix.SCM.Path, bar: Mix.SCM.Git}
回傳所有相依性的相依性,以對應形式呈現。
選項
:depth
- 僅傳回深度層級的相依性,深度為1
時,僅會傳回頂層相依性:parents
- 從指定的父項而非應用程式根目錄開始相依性遍歷
範例
Mix.Project.deps_tree()
#=> %{foo: [:bar, :baz], bar: [], baz: []}
確保給定專案的專案結構存在。
如果存在,則為 no-op。否則,將會建置。
opts
是可以傳遞給 build_structure/2
的相同選項。
@spec get() :: module() | nil
如果有一個專案,則擷取目前的專案。
如果沒有目前的專案,則傳回 nil
。這可能會發生在目前目錄中沒有 mix.exs
的情況。
如果您預期定義專案,亦即這是目前任務的要求,您應該改為呼叫 get!/0
。
@spec get!() :: module()
與 get/0
相同,但如果沒有目前的專案,則會引發例外狀況。
這通常是由需要專案的其他功能的任務呼叫。由於此類任務通常取決於定義的專案,因此此功能會在沒有可用專案的情況下引發 Mix.NoProjectError
例外。
在給定的專案內執行給定的 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"
傳回儲存清單的路徑。
預設情況下,它們儲存在建置目錄內的應用程式路徑中。Umbrella 應用程式會將清單路徑設定為建置目錄的根目錄。目錄可能會在未來的版本中變更。
傳回的路徑將會展開。
範例
如果你的專案定義了應用程式 my_app
Mix.Project.manifest_path()
#=> "/path/to/project/_build/shared/lib/my_app/.mix"
@spec parent_umbrella_project_file() :: binary() | nil
如果有的話,傳回定義父層傘狀專案的檔案路徑。
大部分時間,它會指向 mix.exs
檔案。如果不在專案內或不在傘狀專案內,則傳回 nil
。
@spec project_file() :: binary() | nil
傳回定義目前專案的檔案路徑。
大部分時間,它會指向 mix.exs
檔案。如果不在專案內,則傳回 nil
。
如果 config
是傘狀專案的組態,則傳回 true
。
當不帶任何引數呼叫時,會告知目前的專案是否為傘狀專案。