Comment puis-je compiler mes Lua scripts dans un seul fichier exécutable, tout en bénéficiant des avantages de performances ultra rapides de LuaJIT?
Contexte:
.lua
fichiers qui composent mon application Web (à partir de modèles/vues/contrôleurs)Pour des raisons de simplicité de déploiement, j'aimerais compiler tous mes scripts .lua qui exécutent mon application Web vers un seul exécutable.
Est-ce possible et comment?
Il semble que Lua officiel est livré avec une bibliothèque appelée SRLua
Traduisez tous les fichiers de code source Lua en fichiers objets et placez-les dans une bibliothèque statique:
for f in *.lua; do
luajit -b $f `basename $f .lua`.o
done
ar rcus libmyluafiles.a *.o
Reliez ensuite la bibliothèque libmyluafiles.a
À votre programme principal à l'aide de -Wl,--whole-archive -lmyluafiles -Wl,--no-whole-archive -Wl,-E
.
Cette ligne force l'éditeur de liens à inclure tous les fichiers objets de l'archive et à exporter tous les symboles.
Par exemple, un fichier nommé foo.lua peut maintenant être chargé avec local foo = require("foo")
depuis votre application.
Les détails sur l'option -b
Peuvent être trouvés sur Running LuaJIT .
Pour une application Web que vous déployez actuellement en tant qu'imbrication de .lua
fichiers, votre réponse la plus simple sera de les condenser en un seul fichier. Cela peut souvent être fait pour les cas simples avec luac
. Cependant, pour les applications complexes avec un mélange de modules, vous voulez quelque chose de plus intelligent.
J'utilise personnellement l'utilitaire de Mathew Wild squish
pour faire quelque chose de similaire.
Après avoir exécuté squish, vous aurez un seul .lua
fichier contenant tout le code source de Lua regroupé facilement. Vous pouvez simplement déployer ce fichier unique.
Si vous devez également regrouper des modules binaires ou l'interpréteur Lua ou LuaJIT, vous pouvez facilement utiliser SRLua pour le regrouper avec l'interpréteur Lua, ou des techniques similaires pour le regrouper avec LuaJIT.