- Lux, Lua kodunun oluşturulmasını, bakımını ve dağıtımını basit bir CLI altında toplayan yeni bir paket yöneticisi;
cargobenzeri tanıdık geliştirme akışlarını Lua ekosistemine getirmeyi hedefliyor - Bir yıldan biraz uzun süren geliştirme sonrasında günlük işler için oldukça kullanılabilir bir duruma ulaştı; ancak MSVC desteği, hata mesajları ve uç durumların iyileştirilmesi 1.0 sürümü öncesindeki işler arasında kalıyor
lux.tomltabanlı proje modeli, otomatik rockspec üretimi, lockfile, paralel derleme, Lua header kurulumu ve biçimlendirme/lint/test çalıştırmayı tek bir akışta birleştiriyor- Luarocks ekosistemiyle uyumluluğu korurken, eski uyumluluk yükünü, sisteme göre değişen öngörülemezliği ve yavaş kurulum/senkronizasyon deneyimini azaltmaya odaklanıyor
- Neovim eklentilerinin dağıtımı ve Nix entegrasyonu başlıca kullanım alanları;
rocks.nvimin Luarocks yerine Lux tabanlı olarak yeniden yazılması sonraki adımlar arasında yer alıyor
Lux’un sunduğu Lua paket yönetimi akışı
- Lux, Lua kodunun oluşturulması, bakımı ve dağıtımı için yeni bir paket yöneticisi
- CLI, Rust’ın
cargogibi iyi bilinen paket yöneticilerinden ilham alıyor - Şu anda “günlük işler için oldukça kullanılabilir” seviyeye ulaşmış durumda
- MSVC desteği, hata mesajları ve uç durum iyileştirmeleri hâlâ tamamlanmayı bekliyor
- Bu düzeltmeler 1.0 sürümü planına dahil
Proje modeli ve geliştirme araçları entegrasyonu
- Sistemler arasında taşınabilirliği destekler; paralel derleme ve paralel kurulum yapabilir
- Lua header kurulumunu Lux üstlenir
- Desteklenen hedefler Lua 5.1, 5.2, 5.3, 5.4 ve luajit’tir
- Paket yazarının yalnızca uyumlu Lua sürümlerini belirtmesi yeterlidir
lux-libcrate’i tamamen gömülebilir ve Lua API’si açığa çıkaracak şekilde de derlenebilirlux.tomldosyasını merkeze alan bir proje kavramı sunarlux.tomlüzerinden otomatik olarak rockspec üretir- Depoda birden fazla rockspec dosyasını doğrudan yönetme yükünü azaltır
- Lockfile, tekrarlanabilir derlemeleri ve geliştirme ortamlarını hedefler
- Kaynak hash’lerini ve rockspec hash’lerini saklar
- Bu hash’ler Lux’u Nix ile entegre etmeyi kolaylaştırmak için kullanılabilir
- Kod biçimlendirme ve linting de CLI’nin içine dahildir
bustedtabanlı test çalıştırmayı varsayılan olarak destekler- Neovim, Lua yorumlayıcısı olarak kullanılabilir
- Temiz bir ortam oluşturur
Luarocks’tan farkları
- Luarocks geniş kapsamlıdır; ancak yaklaşık 20 yıllık uyumluluk yükü nedeniyle modern Lua geliştirmeye uyarlanması zor bir sorun haline gelmiştir
- Lux yeni bir başlangıcı hedefler ve ana manifest biçimi olarak TOML kullanır
- CLI ile bağımlılıklar eklenebilir, kaldırılabilir, sabitlenebilir ve güncellenebilir
lux.tomlbulunan bir proje dizinindebuildgibi komutlar projeyi derler ve projenin yerel ağacına kurar- Derleme sırasında proje bağımlılıklarının lockfile’ını oluşturarak, uyumlu sistemlerde aynı bağımlılıkların yeniden üretilmesini sağlar
- SemVer kullanımını teşvik etme biçimi de farklıdır
- Luarocks, patch sürümünden sonra keyfi sürümlere izin verir
- Örneğin
1.0.1.0.0.0.2, Luarocks’ta geçerlidir; ancak yararlı bir anlam taşımadığı düşünülür - Lux da bunu ayrıştırır, fakat patch sürümünden sonraki değerleri ön sürüm sürümü olarak ele alır
- Paralel derleme, Nix store’dan ilham alır
- Lux, paket çakışmalarını önlemek için kurulum dizinlerini hash’ler ve dosya sistemi bozulması riski olmadan paralel derlemeyi mümkün kılar
- İlgili ayrıntılar Lux’un paket çakışmaları rehberinde bulunur
Neovim ekosisteminde kullanım
rocks.nvimvelazy.nvim’in Luarocks desteğinden sonra Luarocks, Neovim eklentileri için bir dağıtım yöntemi olarak popülerlik kazanıyor- Ancak mevcut Luarocks kullanımı tam taşınabilirlikten yoksun ve sonuçları sistemden sisteme öngörmek zor
- Luarocks Lua ile yazıldığı için çok sayıda paket kurulumu ve
rocks.nvimeklenti senkronizasyonu çok yavaştı - Lux kullanımı yıkıcı değildir ve Neovim eklentilerinin mevcut Git tabanlı dağıtım şeklini engellemez
--nvimbayrağı kullanıldığında paketleri Neovim’in:h packagesile uyumlu bir ağaç yapısına kurar
Nix entegrasyonu için lockfile
- Neovim eklentileri Luarocks paketi olarak mevcut olduğunda
nixpkgsbunu kanonik kaynak olarak kullanır- Çünkü uygun bir paket yöneticisinde bağımlılıkları bildirme sorumluluğu paket yazarına aittir
- Luarocks’un lockfile desteği temeldir ve kaynak hash’i içermez
- Hem Luarocks hem Lux,
luarocks.loaderaracılığıyla çakışan bağımlılıkları destekler - nixpkgs için aynı bağımlılığın birden fazla sürümünü paket setine makul biçimde eklemek zordur
- Lux’un
lux.lockdosyası her bağımlılığın kaynak hash’ini ve rockspec hash’ini saklar- Kaynak URL’si bir Git deposuysa Lux, NAR hash saklar
lux.lock,Cargo.lockgibi tüm bağımlılıkları içeren bir fixed-output derivation oluşturmak için kullanılabilir
Sonraki adımlar ve belgeler
- Şu anki öncelik hata düzeltmeleri ve hata mesajlarının iyileştirilmesidir
rocks.nvim, Luarocks yerine Lux’u dahili olarak kullanacak şekilde yeniden yazılacak- Bu yeniden yazım,
rocks.nvimin hızını diğer eklenti yöneticileriyle aynı seviyeye çıkarmayı hedefliyor - Başarılı olursa Lux’un başka yerlere de gömülebileceğini gösteren bir örnek olacak
- Örnek olarak geçmişte Luarocks ile ilgili sorunlar yaşamış olan
lazy.nvimanılıyor
- Bu yeniden yazım,
- İlk kullanıcılar belge sitesinde eğitimleri ve rehberleri görebilir
- Sorular veya issue’lar GitHub discussions ya da issue tracker üzerinden alınır
- Lux, LGPLv3.0+ lisanslıdır; Lux logosu ise © 2025 Kai Jakobi’ye ait CC BY-NC-SA 4.0 lisansı kapsamındadır
1 yorum
Hacker News yorumları
Betik dillerinin Aşil topuğu çalıştırma ortamıdır. Kişisel olarak Neovim kullanmıyorum ama Neovim’in benimsenmesinin Lua tarafında bu alanın gelişimini iteceğini düşünmüştüm
Bryan Cantrill JavaScript’i “C kıyafeti giymiş LISP” diye adlandırmıştı; bazı yönlerden Lua bana bunun tersi gibi geliyor ve bu yüzden hoşuma gidiyor. Yalnız işte kullanmam gerektiği hiç olmadı
Koreader[1] gibi projelerin Lua’yı ana uygulama dili olarak kullandığını biliyorum. Böyle projelerden birini geçiş yapmaya ikna edebilirseniz, bu fikrin olgunluğu ve popülerliği konusunda belli ölçüde güven verebilir
[1]: https://github.com/koreader/koreader
Gerçekten iyi görünüyor. Lua’yı çok kullanıyorum; luarocks ise o kadar katı bir yönelime sahip ki ihtiyaç duyduğum işler için neredeyse işe yaramazdı
“Yerel sistemde doğrudan çalıştırılacak kütüphane kurmak” çizgisinden biraz bile sapınca daha en baştan duvara tosluyorsunuz. Lua paketleri kullanan gömülü bir betik ortamınız varsa ve betikleri bağımlılıklarıyla birlikte paketleyip dağıtmak istiyorsanız vazgeçmeniz gerekiyordu
Bu aracın o kullanım için daha iyi olup olmadığını bilmiyorum; ama olmasa bile luarocks en iyi ihtimalle hantal ve kullanması sinir bozucu
İlginç bir proje. Pixi’de conda-forge ekosistemi üzerinden daha iyi Lua desteği oluşturmak için birlikte çalışmak isterim
Halihazırda lua ve birkaç C eklentisini paketliyoruz. C eklentileri Pixi’nin çekirdek alanlarından biri, bu yüzden iyi uyabilir diye düşünüyorum
pixi.sh dokümantasyonu ve kayıttaki lua paketi: https://prefix.dev/channels/conda-forge/packages/lua
Burada ya da ilgili sitede göremediğim için soruyorum:
package.pathvepackage.cpathile yerel olarak entegre oluyor mu, brew(1) gibi standart dışı ama yaygın kullanılan kurulumları algılıyor mu, GitHub:user/:repositorybiçimiyle kurulum yapılabiliyor mu merak ediyorumProje havalı ve iyi yapılmış görünüyor
lx runvelx luakomutlarıPATH,LUA_PATH,LUA_CPATHayarlıyor. Ayrıca bu ortam değişkenlerini ayarlamak içinlx pathkomutu da varLua kurulumunu algılama varsayılan olarak pkg-config kullanıyor; bulamazsa
lua_srcveluajit_srccrate’leriyle Lua kurmayı deniyor. İleride vcpkg gibi başka araçlar için destek de eklenebilirGitHub
:user/:repositorykurulumu henüz yok. Bunulux.toml/bağımlılık tanımına ekleme planı var; ama bu biçimdeki rockspec’leri luarocks.org’da yayımlamaya muhtemelen izin vermeyeceğim. Çünkü insanları luarocks ile derlenemeyen paketler yüklemeye teşvik eden kişi olmak istemiyorumC’ye gömülmek üzere tasarlanmış ve C kütüphanelerine büyük ölçüde dayanan bir dil için paket yöneticisi Rust ile yazılıyor, Lua’nın kendisi C programları için yapılandırma dili olarak yaratılmışken yapılandırma TOML ile mi yapılıyor
Kalsın. Luarocks’un sınırları var ve muhtemelen yeniden yazılması gerekir; ama ekosisteme uygun bir dil kullanılmalı ve Lua ekosisteminin kültürü izlenmeli. Rust ve Cargo, Lua’nın tam karşı tarafında duruyor
Kişisel olarak bu tür dile özel paket yöneticilerinden çok sıkıldım. Doğru yön gibi gelmiyor; nix gibi bir yaklaşım çok daha iyi görünüyor
Rust’a bağımlı bir Lua paket yöneticisi ha
Hoşuma gitti. Epey zamandır birden fazla makinede tekrarlanabilir Lua paket kurulumu yöntemi istiyordum
Biri, “ham” biçimde iç VM’e linkleyip proje derlemesinin bir parçası olarak
.luakod tabanını yönetmek; diğeri ise sistem aracı olarak kullanıpluarocks --local, luaenv gibi araçları uygun şekilde Makefile/CMakeLists.txt içine koymak ve dağıtım paketleri için luastatic’i biraz devreye almakDürüst olmak gerekirse bu Python’dan ya da birlikte gömülebilecek başka betik dillerinden çok farklı değil. Ancak sistemin sağladığı
/bin/script_languageile, daha büyük bir proje içindeki geliştirme aracı/betik motoru ya da yerel çalışma tezgâhı aracı olarak kullanılan dili her zaman ayırmak gerekiyorLua’yı gerçekten sevmemin nedenlerinden biri, kütüphaneleri paketleyip, bytecode’u linkleyip, paketi sararak hedef işletim sistemi kullanıcısına tek tıkla kurulum biçiminde sunmanın oldukça kolay ve keyifli olması. Elbette bir miktar elinizi taşın altına koymanız gerekiyor
Harika sayılır ama Lua’nın tasarım yönünün tersine gidiyormuş gibi güçlü bir his veriyor. Lua basit bir gömülebilir dil olarak tasarlandı; burada “paket yönetimi” birkaç zip indirip açmaktan ibaret, “sürüm yönetimi” ise 5.1 uyumlu mu yoksa 5.4 uyumlu mu kullanacağını seçmeye daha yakın