Как скомпилировать Lua-скрипты в один исполняемый файл, все еще получая быстрый компилятор LuaJIT?

Как я могу скомпилировать мой Луа скрипты в один исполняемый файл, а также получить супер быстрые преимущества производительности LuaJIT?

Справочная информация:

  • мой Lua-скриптов для веб-приложения, я создал (например, для размещения http://example.com)
  • мой текущий стек технологий-NGINX (веб-сервер), Lua / LuaJIT (язык для получения динамического содержание)
  • у меня около 50+ .lua файлы, которые составляют мое веб-приложение (из моделей/представлений/контроллеров)
  • операционная система FreeBSD 9

для простоты в развертывании я хотел бы скомпилировать все мои .Lua скрипты, которые запускают мое веб-приложение до одного исполняемого файла.

  1. возможно ли это и как?

    похоже, что Lua official поставляется с библиотекой под названием SRLua

  2. каковы негативы для компиляции моей .lua для одного исполняемого файла (например, будет ли производительность хуже и т. д.)?

2 ответов


перевести все файлы исходного кода 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 опция может быть найдена на Работает LuaJIT.


для веб-приложения, которое в настоящее время развертывается как гнездо связанных .lua файлы, ваш простой ответ будет конденсировать их в один файл. Это часто можно сделать для простых случаев с luac. Тем не менее, для сложных приложений с сочетанием модулей вы хотите что-то умнее.

Я лично использую утилиту Мэтью Уайлда squish сделать нечто подобное.

после запуска squish у вас будет один .lua файл, содержащий все Исходный код Lua удобно упакован. Вы можете просто развернуть этот файл.

Если Вам также нужно связать любые двоичные модули или интерпретатор Lua или LuaJIT, то вы можете легко использовать SRLua для связывания его с интерпретатором Lua или аналогичными методами для связывания его с LuaJIT.