混合运行任意命令

时间:2019-11-25 16:57:11

标签: elixir mix

我在proto/*.proto中有一些协议缓冲区定义。我当前的基于Makefile的构建系统将它们每个都编译为Erlang模块和头文件,以及自描述符(作为.pb文件),然后将描述符嵌入BEAM模块:

foo.proto -> foo_pb.erl, foo_pb.hrl
          -> foo.pb -> foo_pb_desc.beam

我已经执行了mix_protobuffs任务以完成第一步,而foo.proto -> foo.pb则是分步。

我还获得了将任意文件嵌入到Erlang模块中的相关代码-受this answer的启发-但我想知道将其集成到基于混合的构建过程中的推荐方法

类似地,我还有一些其他文件需要处理然后嵌入,这表明我不应该让mix_protobuffs任务了解嵌入。

所以我猜我在问:有没有办法让混合命令在执行其他任务之前/之后执行任意命令?

1 个答案:

答案 0 :(得分:1)

常见的方法是定义自己的编译器。为此,您将在Mix.Task.Compiler名称空间中创建模块并实施Mix.Task.Compiler行为。还应该更新project/0的{​​{1}}函数以返回新的编译器。如下所示。

mix.exs

在您的项目文件中:

defmodule Mix.Tasks.Compile.Protobufs do
  use Mix.Task.Compiler

  @recursive true

  @impl Mix.Task.Compiler
  def run(argv) do
    # do your compilation, possibly with System.cmd/3
    :ok
  end
end

您还可以从自己的任务中调用任何现有的def project do [ compilers: Mix.compilers() ++ [:protobufs], # ... ] end 任务,例如mix

相关问题