42

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

背景:

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

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

  1. 这可能吗?如何?

    貌似Lua 官方自带了一个叫SRLua的库

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

2 回答 2

93

将所有 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

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

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

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

于 2012-07-03T20:07:46.847 回答
2

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

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

运行 squish 后,您将拥有一个.lua包含所有 Lua 源代码的文件,方便打包。您可以只部署该单个文件。

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

于 2012-07-03T19:12:03.287 回答