如何将Lua脚本编译成单个可执行文件,同时仍然获得快速的LuaJIT编译器?

我该如何将我的 Lua 脚本编译成一个单一的可执行文件,同时也获得 LuaJIT 的超级快速性能优势?

背景:

  • 我的 Lua 脚本是为我创建的 Web 应用程序而编写的(例如托管 http://example.com
  • 我目前的技术堆栈是 NGINX(Web 服务器)、Lua/LuaJIT(检索动态内容的语言)
  • 我有大约 50 多个.lua文件组成我的 Web 应用程序(来自模型/视图/控制器)
  • FreeBSD 9 操作系统

为了简化部署,我想将运行我的 Web 应用程序的所有 .lua 脚本编译成单个可执行文件。

  1. 这可以实现吗?该怎么做?

    Lua 官方似乎带有一个名为 SRLua 的库。

  2. 将我的 .lua 编译成单个可执行文件的负面影响是什么(例如性能会变差等)?

点赞
用户68204
用户68204

针对您当前部署为 .lua 文件夹集合的 Web 应用,最简单的方法就是将它们压缩成单个文件。对于简单的情况,可以使用 luac 来完成此任务。但是对于复杂的应用,由于需要使用混合模块,因此需要更智能的工具。

我个人使用Mathew Wild的工具squish来完成类似的操作。

运行 squish 后,您将获得一个包含所有 Lua 源代码的单个 .lua 文件。您可以直接部署该单个文件。

如果您需要将任何二进制模块或 Lua / LuaJIT 解释器打包在一起,那么可以使用 SRLua 将其与 Lua 解释器绑定,或使用类似的技术将其与 LuaJIT 绑定。

2012-07-03 19:12:03
用户1657919
用户1657919

将所有的 Lua 源代码文件转换为目标文件并将它们放入静态库中:

for f in *.lua; do
    luajit -b $f `basename $f .lua`.o
done
ar rcus libmyluafiles.a *.o

然后使用 -Wl,-整个存档- lmyluafiles- Wl,-没有整个存档- Wl,-Elibmyluafiles.a 库链接到主程序中。

此行强制链接器包含存档中的所有对象文件并导出所有符号。

例如,名为 foo.lua 的文件现在可以通过 local foo = require("foo") 从应用程序内加载。

有关 -b 选项的详细信息可以在 Running LuaJIT 中找到。

2012-07-03 20:07:46