2012-07-03 10 views
30

Jak mogę skompilować moje Lua skryptów do jednego pliku wykonywalnego, a także zyskuje super szybkich korzyści wydajnościowe LuaJIT?Jak skompilować skrypty Lua do jednego pliku wykonywalnego, a jednocześnie uzyskać szybki kompilator LuaJIT?

Tło:

  • My Lua skrypty są dla aplikacji internetowych stworzyłem (np gospodarzem http://example.com)
  • Moja obecna technologia stosu jest nginx (serwer WWW), Lua/LuaJIT (język, aby pobrać dynamiczny zawartość)
  • mam około 50+ .lua plików tworzących moją aplikację internetową (z modeli/views/controllers)
  • FreeBSD 9 systemu operacyjnego

Dla uproszczenia przy wdrażaniu, chciałbym skompilować wszystkie moje skrypty .lua, które uruchamiają moją aplikację internetową do jednego pliku wykonywalnego.

  1. Czy to możliwe i jak?

    Wydaje się, że Lua oficjalny pochodzi z biblioteki o nazwie SRLua

  2. Jakie są negatywy do kompilacji w dół mojego .lua do pojedynczego pliku wykonywalnego (np wydajność byłaby gorsza, itp)?
+0

Jest to aplikacja internetowa, prawda? Czy to nie oznacza, że ​​uruchamiasz go ... z przeglądarki internetowej? Więc nie jest to plik wykonywalny do pobrania, prawda? –

+0

Tak, aplikacja internetowa. Bez pobierania. To wszystko po stronie serwera. – nickb

+0

Ma to na celu uproszczenie mojego wdrożenia po stronie serwera w celu łatania itd. Mojego kodu. Zajmuje ponad 50 plików .lua, aby uruchomić moją aplikację internetową już dziś. Co oznacza, że ​​muszę przechowywać 50+ plików .lua na moim serwerze i upewnić się, że mam wszystkie właściwe pliki. Gdybym mógł (1) skonsolidować to do pojedynczego skompilowanego pliku, to ułatwiłoby to konserwację serwera i wersjonowanie DUŻEGO i (2) gdyby były zalety wydajnościowe (?), Które również byłyby świetne. – nickb

Odpowiedz

69

Przekłada wszystkie pliki kodu źródłowego Lua sprzeciwić pliki i umieścić je w statycznej biblioteki:

for f in *.lua; do 
    luajit -b $f `basename $f .lua`.o 
done 
ar rcus libmyluafiles.a *.o 

następnie połączyć bibliotekę libmyluafiles.a do głównego programu przy -Wl,--whole-archive -lmyluafiles -Wl,--no-whole-archive -Wl,-E.

Ta linia zmusza łącznik do dołączenia wszystkich plików obiektów z archiwum i wyeksportowania wszystkich symboli.

Na przykład plik o nazwie foo.lua można teraz załadować z poziomu local foo = require("foo") z poziomu aplikacji.

Szczegółowe informacje na temat opcji -b można znaleźć pod adresem Running LuaJIT.

+15

Wahoo! Mike Pall z LuaJit odpowiedział na to pytanie :) – nickb

+10

wielkie dzięki za twoją pracę nad LuaJIT! To naprawdę niesamowite, co zrobiłeś. – nickb

+0

To polecenie basename nie działa w systemie Ubuntu 13.04. Kończy to zastąpienie oryginalnego pliku lua bajtekodowaną wersją – Matt

2

W przypadku aplikacji sieciowej, która jest obecnie wdrażana jako gniazdo powiązanych plików .lua, najprostszą odpowiedzią będzie skondensowanie ich w jednym pliku. Często można to zrobić w prostych przypadkach z luac. Jednak w przypadku złożonych aplikacji z mieszanką modułów potrzebujesz czegoś mądrzejszego.

Osobiście używam narzędzia użytkowego Mathew Wilda squish, aby zrobić coś podobnego.

Po uruchomieniu zgniatania, będziesz mieć pojedynczy plik .lua zawierający wszystkie łatwo spakowane kody źródłowe Lua. Możesz po prostu wdrożyć ten pojedynczy plik.

Jeśli potrzebujesz również pakować dowolne moduły binarne lub interpreter Lua lub LuaJIT, możesz łatwo użyć narzędzia SRLua w pakiecie z interpreterem Lua lub podobnymi technikami, aby połączyć je z LuaJIT.

+0

To naprawdę nie jest kompilacja do pojedynczego pliku wykonywalnego, jak w moim oryginalnym pytaniu, ale zamiast tego - łączenie wszystkich moich plików .lua w pojedynczy plik .lua? – nickb

+0

Chociaż można przejść do pliku wykonywalnego, a także można użyć squish, aby uprościć gromadzenie zależności w celu połączenia z tym plikiem wykonywalnym, można również zatrzymać się za pomocą pojedynczego pliku '.lua'. [Mike Pall] (http://stackoverflow.com/a/11318414/68204) dostarczył dobry przepis na łączenie LuaJIT z plikami '.lua'. – RBerteig

Powiązane problemy