You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:45:32