web-dev-qa-db-fra.com

Comment compiler des scripts Lua en un seul exécutable, tout en obtenant le compilateur LuaJIT rapide?

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:

  • Mes scripts Lua sont pour une application Web que j'ai créée (par exemple pour héberger http://example.com )
  • Ma pile technologique actuelle est NGINX (serveur Web), Lua/LuaJIT (langue pour récupérer du contenu dynamique)
  • J'ai environ 50+ .lua fichiers qui composent mon application Web (à partir de modèles/vues/contrôleurs)
  • Système d'exploitation FreeBSD 9

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.

  1. Est-ce possible et comment?

    Il semble que Lua officiel est livré avec une bibliothèque appelée SRLua

  2. Quels sont les inconvénients de compiler mon .lua en un seul exécutable (par exemple, les performances seraient-elles pires, etc.)?
40
nickb

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 .

87
Mike Pall

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.

2
RBerteig