`erl -make` 命令是不是可以扩展来执行编译 .erl 文件以外的操作?

Posted

技术标签:

【中文标题】`erl -make` 命令是不是可以扩展来执行编译 .erl 文件以外的操作?【英文标题】:Can the `erl -make` command be extended to do things other than compiling .erl files?`erl -make` 命令是否可以扩展来执行编译 .erl 文件以外的操作? 【发布时间】:2013-01-09 03:25:44 【问题描述】:

我想将 Elixir 集成到我们的项目中,而好的旧代码不使用 rebar,所以我认为将构建 .ex 文件的规则写到 Emakefile 中可能是一个好主意,但是这个人页面here 没有提及任何相关内容。

编辑:

我们团队主要在Windows环境下工作,但是部署会在Linux服务器上完成,所以我需要一个跨平台的解决方案。由于 Erlang 本身是跨平台的,我想用erl -make 命令来做。

当然我可以写一个Makefile,但是我需要一个build.bat或类似的东西来在我们的开发环境中构建代码,因为我们的开发机器上没有make命令.

谁有更好的主意?

更新:

如果有人想知道,我是这样做的:

    将 Elixir 源代码树中的 lib/elixir 目录复制到我们的源目录,例如 some_project/src/tools/elixir。 按顺序将some_project/src/tools/elixir/src/elixir_transform.erlsome_project/src/tools/elixir/src/* 添加到Emakefile。将输出目录设置为some_project/ebin(所有其他.beam 文件都位于那里)。 将 Elixir 源代码树中的 src/elixir.app.src 复制到 some_project/ebin/elixir.app,并对其进行编辑以修复版本代码。 在some_project 目录中运行erl -pa ebin -make 构建Erlang 代码。 通过运行 erl -pa ebin -s elixir_compiler core -s erlang halt 构建 Elixir 编译器 现在我们的代码中有一个可用的 Elixir 环境,我使用以下 escript 构建我们的自定义 .ex 文件:
%%! -pa ./ebin
main(_) ->
    ExList = [ 
        <<"source_1.ex">>,
        <<"source_2.ex">>,
        <<"source_3.ex">>],
    application:start(elixir),
    gen_server:call(elixir_code_server, compiler_options, [docs, true, debug_info, true]),
    [elixir_compiler:file_to_path(F, <<"./ebin">>) || F <- ExList],
    erlang:halt(0).

【问题讨论】:

我想我可以写一个 parse_transform 并将它连接到一个特殊的空模块上,以便在编译时做任何我想做的事情,但这有点乱...... 我最后使用了 Makefile-and-bat 方法,结果还不错...... 【参考方案1】:

如果你想显式编译 Elixir,我会选择 Makefile 方法,因为 Elixir 总是支持它。但是,我会推荐预编译的二进制文件,甚至假设 Elixir 安装在每台开发人员机器上。你甚至可以在你的 Emakefile 中添加一个任务来保证每个人都在使用正确的 Elixir 版本。

最后,关于编译您自己的 Elixir 代码,我建议您直接使用 mixmix 是 Elixir 附带的二进制文件,您可以简单地从您的 Emakefile 执行 ./src/tools/elixir/bin/mix compile

如果无法使用 mix,您应该使用并行编译器,因为它会使用您机器中可用的所有内核编译文件,并且会自动检测和解决文件之间的依赖关系。下面是一个从erlang调用并行编译器的例子:

https://github.com/basho/rebar/pull/347/files#L1R62

API 非常简单。它期望将文件名列表编译为二进制文件,并将文件输出到另一个二进制文件的目录。

【讨论】:

谢谢!终于有人出现了,他就是灵药的创造者! +1 并行编译器提示 :)

以上是关于`erl -make` 命令是不是可以扩展来执行编译 .erl 文件以外的操作?的主要内容,如果未能解决你的问题,请参考以下文章

Erlang:从命令行调用 erl -eval 永远不会退出

如何在erl中为单个标志设置多个命令行参数

Erlang 标准模块与使用手册

erl模块翻译

模拟远程SSH执行命令的编解码说明

shell从入门到精通关于内建命令(内置命令)和外建命令