escript能否调用其他escript的函数?如何实现免手动编译自动加载?
escript自动加载同目录.escript后缀模块实现方法
核心问题是Erlang默认编译接口c:c/1只会识别.erl后缀的源文件,不会主动识别.escript后缀的模块文件,不需要手动提前编译,有两种成熟方案可以直接实现需求:
方案1:保留独立b.escript文件,运行时自动编译
修改a.escript的入口逻辑,明确指定编译目标为b.escript,同时将编译生成的beam文件输出到当前工作目录,保证Erlang代码加载器可以正常找到模块:
修改后的a.escript代码:
main(_)-> %% 编译同目录下的b.escript,输出beam到当前路径 {ok, b} = compile:file("b.escript", [{outdir, "."}]), b:read_config().
直接执行escript a.escript即可正常运行,不需要提前执行任何手动编译操作。
注意:原b.escript里缺少
-export([read_config/0]).导出声明,部分Erlang版本运行时会抛出函数未导出错误,需要补上这行声明。
补全后的b.escript正确代码:
-module(b). -export([read_config/0]). %% function exported read_config()-> %% read file io:format("hh~n").
方案2:将b模块内嵌到a.escript中
escript原生支持单文件内嵌多个Erlang模块,运行时会自动完成所有内嵌模块的编译加载,不需要维护独立的b.escript文件:
合并后的a.escript代码:
%% 入口执行逻辑 main(_)-> b:read_config(). %% 内嵌b模块 -module(b). -export([read_config/0]). read_config()-> io:format("hh~n").
原c:c(b)写法失效原因
c:c(b)的默认逻辑是在当前代码搜索路径下查找名为b.erl的源文件,不会匹配b.escript后缀的文件,因此会报源文件不存在的错误,无法完成自动编译。
内容的提问来源于stack exchange,提问作者IclodQ
相关产品推荐
相关产品推荐

