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

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

背景:

  • 我的Lua脚本适用于我创build的Web应用程序(例如,托pipehttp://example.com )
  • 我目前的技术堆栈是NGINX(networking服务器),Lua / LuaJIT(检索dynamic内容的语言)
  • 我有大约50+ .lua文件组成我的web应用程序(从模型/视图/控制器)
  • FreeBSD 9操作系统

为了简单起见,我想将所有运行我的web应用程序的.lua脚本编译成一个可执行文件。

  1. 这是可能的和如何?

    Lua官员似乎有一个名为SRLua的图书馆

  2. 把我的.lua编译成单个可执行文件有什么不好的地方(例如性能会更糟,等等)?

将所有的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选项的详细信息可以在运行LuaJIT中找到。

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

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

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

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