`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.erl
和some_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 代码,我建议您直接使用 mix
。 mix
是 Elixir 附带的二进制文件,您可以简单地从您的 Emakefile
执行 ./src/tools/elixir/bin/mix compile
。
如果无法使用 mix,您应该使用并行编译器,因为它会使用您机器中可用的所有内核编译文件,并且会自动检测和解决文件之间的依赖关系。下面是一个从erlang调用并行编译器的例子:
https://github.com/basho/rebar/pull/347/files#L1R62
API 非常简单。它期望将文件名列表编译为二进制文件,并将文件输出到另一个二进制文件的目录。
【讨论】:
谢谢!终于有人出现了,他就是灵药的创造者! +1 并行编译器提示 :)以上是关于`erl -make` 命令是不是可以扩展来执行编译 .erl 文件以外的操作?的主要内容,如果未能解决你的问题,请参考以下文章