Подтвердить что ты не робот

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

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

Фон:

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

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

  • Возможно ли это и как?

    Похоже, что официальный представитель Lua имеет библиотеку под названием SRLua

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

Ответ 1

Переведите все файлы исходного кода 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.

Ответ 2

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

Я лично использую утилиту Mathew Wild squish, чтобы сделать что-то подобное.

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

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