[英]Running arbitrary commands in 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 模块的相关代码——受此答案的启发——但我想知道将它集成到我的基于混合的构建过程中的推荐方法。
同样,我还有一些其他文件需要处理然后嵌入,这表明我不应该让mix_protobuffs
任务知道嵌入。
所以我想我在问:有没有办法在另一个任务之前/之后混合运行任意命令?
常见的方法是定义自己的编译器。 为此,您将在Mix.Task.Compiler
命名空间中创建一个模块并实现Mix.Task.Compiler
行为。 您的mix.exs
的project/0
函数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
任务,例如Mix.Tasks.Run.run(args)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.