檢視原始碼 mix compile.elixir (Mix v1.16.2)
編譯 Elixir 原始檔。
Elixir 足夠聰明,只會重新編譯已變更的檔案及其相依性。這表示如果 lib/a.ex
在編譯期間呼叫在 lib/b.ex
中定義的函式,只要 lib/b.ex
變更,lib/a.ex
也會重新編譯。
請注意,如果檔案的原始檔自上次編譯後在磁碟上變更,而且其內容不再相同,Elixir 會將檔案視為已變更。
@external_resource
如果模組相依於外部檔案,這些檔案可以用 @external_resource
模組屬性註解。如果這些檔案變更,Elixir 模組會自動重新編譯。
__mix_recompile__?/0
模組可以匯出 __mix_recompile__?/0
函式,這會導致模組使用自訂規則重新編譯。例如,若要在特定目錄中的檔案變更時重新編譯,您可以結合 @external_resource
(用於現有檔案)和 __mix_recompile__?/0
檢查(用於驗證何時將新項目新增至目錄本身)。
defmodule MyModule do
paths = Path.wildcard("*.txt")
@paths_hash :erlang.md5(paths)
for path <- paths do
@external_resource path
end
def __mix_recompile__?() do
Path.wildcard("*.txt") |> :erlang.md5() != @paths_hash
end
end
編譯器會對每個正在編譯(或先前編譯)的模組呼叫 __mix_recompile__?/0
,因此在其中執行盡可能少的工作非常重要,以免減慢編譯速度。
如果模組有 @compile {:autoload, false}
,__mix_recompile__?/0
將不會使用。
命令列選項
--all-warnings
(--no-all-warnings
) - 列印所有警告,包括先前的編譯(預設為 true,錯誤時除外)--docs
(--no-docs
) - 附加(或不附加)文件至已編譯的模組--debug-info
(--no-debug-info
) - 附加(或不附加)除錯資訊至已編譯的模組--force
- 強制編譯,不論修改時間為何--ignore-module-conflict
- 如果模組先前已定義,則不發出警告--long-compilation-threshold N
- 設定「長時間編譯」閾值(以秒為單位)為N
(請參閱Kernel.ParallelCompiler.compile/2
的文件)--purge-consolidation-path-if-stale PATH
- 如果需要編譯,則刪除並清除給定協定整合路徑中的模組--profile
- 如果設定為time
,則輸出編譯步驟的計時資訊--tracer
- 除了mix.exs
檔案中指定的任何追蹤器外,再新增一個編譯器追蹤器--verbose
- 列印每個正在編譯的檔案--warnings-as-errors
- 將目前專案中的警告視為錯誤,並傳回非零的結束狀態
組態
:elixirc_paths
- 尋找原始檔的目錄。預設為["lib"]
。:elixirc_options
- 適用於 Elixir 編譯器的編譯選項。請參閱Code.put_compiler_option/2
以取得選項的完整清單。這些選項通常可以使用上述開關從命令列覆寫。[xref: [exclude: ...]]
- 一個module
或{module, function, arity}
清單,在未定義的模組或未定義的應用程式警告的情況下,不應對其發出警告。