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

时间:2012-07-03 18:50:20

标签: compilation nginx lua luajit

如何将 Lua 脚本编译成单个可执行文件,同时还能获得 LuaJIT 的超快性能优势?< / p>

背景:

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

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

  1. 这可能吗?如何?

    看来Lua官方附带了一个名为SRLua

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

2 个答案:

答案 0 :(得分:78)

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

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

然后使用libmyluafiles.a-Wl,--whole-archive -lmyluafiles -Wl,--no-whole-archive -Wl,-E库链接到您的主程序。

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

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

有关-b选项的详情,请访问Running LuaJIT

答案 1 :(得分:2)

对于您当前正在部署为相关.lua文件嵌套的Web应用程序,最简单的答案是将它们压缩为单个文件。对于luac的简单案例,通常可以这样做。但是,对于混合模块的复杂应用程序,您需要更智能的东西。

我个人使用Mathew Wild的实用程序squish来做类似的事情。

运行挤压后,您将拥有一个.lua个文件,其中包含所有捆绑的Lua源代码。您可以部署该单个文件。

如果您还需要捆绑任何二进制模块或Lua或LuaJIT解释器,那么您可以轻松地使用SRLua将其与Lua解释器捆绑在一起,或者使用类似的技术将其与LuaJIT捆绑在一起。