查看源代码 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} 的列表,在出现未定义模块或未定义应用程序警告时不应发出警告。