openlang

多个 beam 文件能合成一个吗?

我把 .beam 当作脚本使用,这样能隐藏代码,并在任何地方运行。

通常会有多个文件一起工作,例如


entry.erl
helper.erl
....

能把多个 beam 文件合成一个 beam 吗?

我唯一想到的办法是把 beam 嵌入 erl 文件,然后再编译,例如


["[",
lists:map(fun(Artifact) ->
  {ok, Payload} = prim_file:read_file(Artifact),
  ["{", filename:basename(Artifact, ".beam"), ",", io_lib:format("~w", [Payload]), "},"]
end, Artifacts)
"ok]"]

得到


[{module, <<"....">>}]

最后通过 code:load_file 加载

从英语翻译查看原文

后续讨论 2

顺着彼此的依据读下去
  1. 固定链接

    这样能隐藏代码,并在任何地方运行

    .beam 文件并非完全可移植。Erlang 虚拟机不会接受由更新的 OTP 版本,或者太旧的版本构建的文件。

    我把 .beam 当作脚本使用

    通常这种情况可以用 escript (https://www.erlang.org/doc/apps/stdlib/escript.html),它是一种能容纳多个 beam 文件以及 Erlang 运行时的归档格式。Erlang 运行时附带 escript 程序,可以解包并执行这些归档。rebar3 支持构建 escript。

    从英语翻译查看原文

同一个问题的其他角度

  1. 减少 docker-compose 的控制台输出

    在开发环境里用 docker-compose up 启动所有服务时,我的几个容器会输出几百行又几百行内容。有没有方便的办法过滤这些输出,或者更好一些,让这些服务在 docker-compose up 运行时不要写到标准输出?

    回复 3最近活动 bash
  2. 能否用 D 代替 C 编写 Python 扩展模块?

    看来 D 能与 C 链接。我想用 D 编写 Python 扩展模块。我是不是漏掉了什么原因,导致这种方法根本无法运行?

    回复 2最近活动 d
  3. 通过 Nix 声明 Micro 插件?🤔

    python 可以这样写。 Python.withPackages (q: with q; [ fastapi ]) Micro 编辑器有类似的机制吗? 能不能把 micro 编辑器的软件包和插件一起指定?:thinking: 那样会方便很多。

    回复 3最近活动 nix