我在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
任务了解嵌入。
所以我猜我在问:有没有办法让混合命令在执行其他任务之前/之后执行任意命令?
答案 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
。