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