【问题标题】:How to compile Lua scripts into a single executable, while still gaining the fast LuaJIT compiler?如何将 Lua 脚本编译成单个可执行文件,同时仍然获得快速的 LuaJIT 编译器?
【发布时间】:2012-07-04 06:14:40
【问题描述】:

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

背景:

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

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

  1. 这可能吗?如何实现?

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

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

【问题讨论】:

  • 这是一个网络应用程序,对吧?这是否意味着您运行它...从您的网络浏览器?所以它不是你下载的可执行文件,对吧?
  • 是的,一个网络应用程序。没有下载。这都是服务器端。
  • 这是为了简化我在服务器端的部署,以便对我的代码进行修补等。今天运行我的 Web 应用程序需要 50 多个 .lua 文件。这意味着我必须在我的服务器上托管 50 多个 .lua 文件,并确保我拥有所有正确的文件。如果我可以 (1) 将其整合到单个编译文件中,这将使我的服务器维护和版本控制更加容易,并且 (2) 如果有性能优势 (?) 那也很棒。
  • 我知道这不是最佳做法,但将所有文件作为单独的文本可以让您在实时站点上进行紧急修复,而无需经历整个重建和重新部署周期。如果您在部署期间无法将一组连贯的 50 个文件推送到服务器,您可能需要查看您的部署过程 - 构建统一的可执行文件并不容易。

标签: compilation nginx lua luajit


【解决方案1】:

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

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

运行 squish 后,您将拥有一个 .lua 文件,其中包含方便地捆绑在一起的所有 Lua 源代码。你可以只部署那个文件。

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

【讨论】:

  • 所以,这并没有像我原来的问题那样真正编译成单个可执行文件,而是将我所有的 .lua 文件合并到一个 .lua 文件中?
  • 虽然您可以一直到可执行文件,也可以使用 squish 简化依赖项的集合以链接到该可执行文件,但您也可以只使用单个 .lua 文件。 Mike Pall 提供了将 LuaJIT 与 .lua 文件捆绑在一起的好方法。
【解决方案2】:

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

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

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

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

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

有关-b 选项的详细信息,请访问Running LuaJIT

【讨论】:

  • 哇! LuaJit 的 Mike Pall 回答了这个问题 :)
  • 非常感谢您在 LuaJIT 上所做的所有工作!你所做的真是令人难以置信。
  • 那个 basename 命令在 Ubuntu 13.04 上不起作用。它最终用字节编码的版本覆盖了原始的 lua 文件
  • 我认为你想要的是:for f in *.lua;做 luajit -b $f basename $f .lua.o;完成
  • 如果您有两个同名文件,但它们位于不同的目录中,您应该怎么做?即 a/foo.lua 和 b/foo.lua。当我尝试链接生成的 .o 文件时,出现重复符号错误(重复符号 _luaJIT_BC_foo)
猜你喜欢
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2012-07-28
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多