42

LuaJITの超高速パフォーマンスの利点を得ながら、 Luaスクリプトを単一の実行可能ファイルにコンパイルするにはどうすればよいですか?

バックグラウンド:

  • 私のLuaスクリプトは、私が作成したWebアプリケーション用です(たとえば、http://example.comをホストするため)
  • 私の現在のテクノロジー スタックは、NGINX (Web サーバー)、Lua/LuaJIT (動的コンテンツを取得するための言語) です。
  • Web アプリケーションを構成する約 50 以上の.luaファイルがあります (モデル/ビュー/コントローラーから)
  • FreeBSD 9 オペレーティング システム

展開を簡単にするために、Web アプリケーションを実行するすべての .lua スクリプトを 1 つの実行可能ファイルにコンパイルしたいと思います。

  1. これは可能ですか?

    Lua公式にはSRLuaというライブラリが付属しているようです

  2. .lua を単一の実行可能ファイルにコンパイルすることのマイナス面は何ですか (たとえば、パフォーマンスが低下するなど)?
4

2 に答える 2

93

すべての 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オプションの詳細については、Running LuaJITを参照してください。

于 2012-07-03T20:07:46.847 に答える
2

関連ファイルのネストとして現在展開している Web アプリの場合.lua、最も簡単な答えは、それらを 1 つのファイルに圧縮することです。これは、多くの場合、 を使用した単純なケースで実行できますluac。ただし、モジュールが混在する複雑なアプリケーションの場合は、よりスマートなものが必要です。

私は個人的にMathew Wildのユーティリティsquishを使って似たようなことをしています。

squish を実行すると、.luaすべての Lua ソース コードが便利にまとめられた 1 つのファイルが作成されます。その単一のファイルを展開するだけです。

バイナリ モジュール、または Lua または LuaJIT インタープリターもバンドルする必要がある場合は、SRLua を使用して Lua インタープリターにバンドルするか、同様の手法を使用して LuaJIT にバンドルすることが簡単にできます。

于 2012-07-03T19:12:03.287 に答える