檢視原始碼 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} 清單,在未定義的模組或未定義的應用程式警告的情況下,不應對其發出警告。