- Lux adalah manajer paket baru yang menyatukan pembuatan, pemeliharaan, dan distribusi kode Lua dalam CLI yang sederhana, dengan tujuan membawa alur kerja pengembangan yang familier seperti
cargoke ekosistem Lua - Setelah dikembangkan selama sedikit lebih dari setahun, proyek ini telah mencapai kondisi sangat layak dipakai untuk pekerjaan sehari-hari, meski dukungan MSVC, pesan kesalahan, dan penanganan edge case masih menjadi pekerjaan sebelum rilis 1.0
- Model proyek berbasis
lux.toml, pembuatan rockspec otomatis, lockfile, build paralel, instalasi header Lua, serta pemformatan, linting, dan pengujian terintegrasi dalam satu alur - Sambil tetap menjaga kompatibilitas dengan ekosistem Luarocks, fokusnya adalah mengurangi beban kompatibilitas lama, ketidakpastian antar-sistem, serta pengalaman instalasi dan sinkronisasi yang lambat
- Distribusi plugin Neovim dan integrasi Nix menjadi kasus penggunaan utama, dan langkah berikutnya mencakup penulisan ulang
rocks.nvimagar berbasis Lux alih-alih Luarocks
Alur manajemen paket Lua yang ditawarkan Lux
- Lux adalah manajer paket baru untuk membuat, memelihara, dan mendistribusikan kode Lua
- CLI-nya terinspirasi dari manajer paket yang sudah dikenal luas seperti
cargomilik Rust - Saat ini proyek ini telah mencapai tingkat “sangat layak dipakai untuk pekerjaan sehari-hari”
- Dukungan MSVC, pesan kesalahan, dan penanganan edge case masih belum selesai
- Perbaikan tersebut termasuk dalam rencana rilis 1.0
Model proyek dan integrasi alat pengembangan
- Mendukung portabilitas antar-sistem, serta memungkinkan build dan instalasi paralel
- Lux menangani instalasi header Lua
- Yang didukung adalah Lua 5.1, 5.2, 5.3, 5.4, dan luajit
- Penulis paket hanya perlu menentukan versi Lua yang kompatibel
- Crate
lux-libsepenuhnya bisa di-embed, dan juga dapat dibangun agar mengekspor API Lua - Menyediakan konsep proyek yang berpusat pada file
lux.toml- Rockspec dibuat secara otomatis dari
lux.toml - Ini mengurangi beban mengelola banyak file rockspec langsung di repositori
- Rockspec dibuat secara otomatis dari
- Lockfile ditujukan untuk build dan lingkungan pengembangan yang reproducible
- Menyimpan hash sumber dan hash rockspec
- Hash ini dapat digunakan untuk mempermudah integrasi Lux dengan Nix
- Pemformatan dan linting kode juga sudah termasuk di dalam CLI
- Mendukung eksekusi pengujian berbasis
bustedsecara bawaan- Neovim dapat digunakan sebagai interpreter Lua
- Menyusun lingkungan yang bersih
Perbedaan dengan Luarocks
- Luarocks memiliki cakupan luas, tetapi sekitar 20 tahun beban kompatibilitas membuatnya sulit disesuaikan dengan pengembangan Lua modern
- Lux menargetkan awal yang baru dan menggunakan TOML sebagai format manifest utama
- Dependensi dapat ditambahkan, dihapus, dikunci, dan diperbarui lewat CLI
- Di direktori proyek yang memiliki
lux.toml, perintah sepertibuildakan membangun proyek dan menginstalnya ke tree lokal proyek - Selama proses build, dibuat lockfile dependensi proyek agar dependensi yang sama dapat direproduksi pada sistem yang kompatibel
- Cara mendorong penggunaan SemVer juga berbeda
- Luarocks mengizinkan versi arbitrer setelah versi patch
- Misalnya
1.0.1.0.0.0.2valid di Luarocks, tetapi dianggap tidak memiliki makna yang berguna - Lux juga dapat mem-parsing ini, tetapi nilai setelah versi patch diperlakukan sebagai versi prarilis
- Build paralel terinspirasi dari Nix store
- Lux melakukan hashing pada direktori instalasi untuk mencegah konflik paket, dan memungkinkan build paralel tanpa risiko merusak filesystem
- Detail terkait ada di panduan konflik paket milik Lux
Penggunaan dalam ekosistem Neovim
- Setelah dukungan Luarocks hadir di
rocks.nvimdanlazy.nvim, Luarocks mulai populer sebagai cara mendistribusikan plugin Neovim - Namun, penggunaan Luarocks yang ada saat ini memiliki keterbatasan dalam portabilitas penuh, dan hasilnya sulit diprediksi antar-sistem
- Karena Luarocks ditulis dalam Lua, instalasi banyak paket dan sinkronisasi plugin
rocks.nvimmenjadi sangat lambat - Penggunaan Lux bersifat non-destruktif, dan saat ini tidak mengganggu cara distribusi plugin Neovim berbasis Git
- Dengan flag
--nvim, paket diinstal ke struktur tree yang kompatibel dengan:h packagesmilik Neovim
Lockfile untuk integrasi Nix
- Jika plugin Neovim tersedia sebagai paket Luarocks, maka
nixpkgsmenggunakannya sebagai sumber acuan- Ini karena pada manajer paket yang semestinya, tanggung jawab deklarasi dependensi ada pada penulis paket
- Dukungan lockfile Luarocks bersifat dasar dan tidak menyertakan hash sumber
- Baik Luarocks maupun Lux mendukung dependensi yang saling bentrok melalui
luarocks.loader - Bagi nixpkgs, menambahkan banyak versi dari dependensi yang sama ke set paket secara masuk akal itu sulit
lux.lockmilik Lux menyimpan hash sumber dan hash rockspec untuk setiap dependensi- Jika URL sumber adalah repositori Git, Lux akan menyimpan NAR hash
lux.lockdapat digunakan sepertiCargo.lockuntuk membuat fixed-output derivation yang mencakup semua dependensi
Langkah berikutnya dan dokumentasi
- Prioritas saat ini adalah perbaikan bug dan peningkatan pesan kesalahan
rocks.nvimdirencanakan akan ditulis ulang agar secara internal menggunakan Lux alih-alih Luarocks- Penulisan ulang ini bertujuan meningkatkan kecepatan
rocks.nvimhingga setara dengan pengelola plugin lain - Jika berhasil, ini akan menjadi contoh bahwa Lux dapat di-embed di tempat lain juga
- Sebagai contoh disebutkan
lazy.nvim, yang pernah memiliki masalah terkait Luarocks di masa lalu
- Penulisan ulang ini bertujuan meningkatkan kecepatan
- Pengguna awal dapat melihat tutorial dan panduan di situs dokumentasi
- Pertanyaan atau isu dapat disampaikan melalui GitHub discussions atau issue tracker
- Lux berlisensi LGPLv3.0+, dan logo Lux berlisensi © 2025 Kai Jakobi CC BY-NC-SA 4.0
1 komentar
Komentar Hacker News
Kelemahan terbesar bahasa scripting adalah lingkungan eksekusi. Secara pribadi saya tidak memakai Neovim, tetapi saya merasa adopsi Neovim akan mendorong kemajuan area ini di sisi Lua
Bryan Cantrill pernah menyebut JavaScript sebagai “LISP berbaju C”; dalam beberapa hal Lua terasa seperti kebalikannya, dan karena itu saya menyukainya. Hanya saja, saya belum pernah harus memakainya untuk pekerjaan
Sejauh yang saya tahu, proyek seperti Koreader[1] memakai Lua sebagai bahasa aplikasi utama. Jika bisa meyakinkan salah satu proyek seperti itu untuk beralih, rasanya itu bisa memberi keyakinan tertentu soal kematangan dan popularitas ide ini
[1]: https://github.com/koreader/koreader
Kelihatannya sangat bagus. Saya banyak memakai Lua, dan luarocks punya arah yang terlalu kaku sehingga hampir tidak berguna untuk kebutuhan saya
Begitu sedikit saja keluar dari “menginstal library untuk dijalankan langsung di sistem lokal”, semuanya langsung buntu sejak awal. Kalau punya lingkungan scripting tertanam yang memakai paket Lua dan ingin membundel skrip bersama dependensinya untuk didistribusikan, ya harus menyerah
Saya tidak tahu apakah alat ini lebih baik untuk kebutuhan itu, tetapi kalaupun tidak, luarocks paling banter tetap kikuk dan menyebalkan untuk dipakai
Proyek yang menarik. Saya ingin bekerja sama untuk membuat dukungan Lua yang lebih baik di Pixi melalui ekosistem conda-forge
Kami sudah memaketkan lua dan beberapa ekstensi C. Ekstensi C adalah area inti Pixi, jadi menurut saya ini bisa cocok
Dokumentasi pixi.sh dan paket lua di registry: https://prefix.dev/channels/conda-forge/packages/lua
Karena saya tidak melihatnya di sini atau di situs terkait, saya ingin bertanya: apakah ini terintegrasi secara native dengan
package.pathdanpackage.cpath, apakah mendeteksi instalasi nonstandar tetapi banyak dipakai seperti brew(1), dan apakah bisa menginstal dengan gaya GitHub:user/:repository?Proyeknya terlihat keren dan dibuat dengan baik
lx rundanlx luamengaturPATH,LUA_PATH,LUA_CPATH. Ada juga perintahlx pathuntuk mengatur variabel lingkungan tersebutDeteksi instalasi Lua pada dasarnya memakai pkg-config, dan jika tidak ditemukan, ia mencoba menginstal Lua lewat crate
lua_srcdanluajit_src. Ke depannya dukungan untuk alat lain seperti vcpkg juga bisa ditambahkanInstalasi GitHub
:user/:repositorybelum bisa. Ada rencana menambahkannya kelux.toml/spesifikasi dependensi, tetapi kemungkinan tidak akan mengizinkan rockspec dengan gaya itu dipublikasikan ke luarocks.org. Sebab saya tidak ingin menjadi penyebab orang mengunggah paket yang tidak bisa dibangun dengan luarocksJadi manajer paket untuk bahasa yang dirancang agar ditanamkan di C dan sangat bergantung pada library C ini ditulis dengan Rust, sementara Lua sendiri dibuat sebagai bahasa konfigurasi untuk program C, tetapi konfigurasinya memakai TOML?
Tidak, terima kasih. Luarocks memang punya keterbatasan dan mungkin perlu ditulis ulang, tetapi harus memakai bahasa yang sesuai dengan ekosistemnya dan mengikuti budaya ekosistem Lua. Rust dan Cargo berada tepat di sisi berlawanan dari Lua
Secara pribadi saya sudah sangat jenuh dengan manajer paket per bahasa seperti ini. Rasanya bukan arah yang benar; pendekatan seperti nix terlihat jauh lebih baik
Manajer paket untuk Lua yang bergantung pada Rust, ya
Saya suka. Sudah cukup lama saya ingin punya cara untuk menginstal paket Lua secara reproducible di beberapa mesin
Yang pertama adalah bentuk “mentah”, ditautkan ke VM internal dan mengelola basis kode
.luasebagai bagian dari build proyek; yang kedua adalah memakainya sebagai alat sistem sambil memasukkan tool sepertiluarocks --localdan luaenv seperlunya ke Makefile/CMakeLists.txt, lalu sedikit memadukan luastatic untuk bundel distribusiSejujurnya ini tidak terlalu berbeda dari Python atau bahasa scripting lain yang bisa ikut dibundel. Hanya saja kita harus selalu membedakan antara
/bin/script_languageyang disediakan sistem dan bahasa yang dipakai sebagai alat pengembangan/mesin scripting di dalam proyek yang lebih besar atau sebagai alat untuk workstation lokalSalah satu alasan saya sangat menyukai Lua adalah karena memaketkan library, menautkan bytecode, membungkus bundel, lalu menyediakannya kepada pengguna sistem operasi target dalam bentuk instalasi sekali klik itu cukup mudah dan menyenangkan. Tentu tetap perlu sedikit kerja manual
Ini bagus, tetapi terasa kuat bergerak berlawanan dengan arah desain Lua. Lua dirancang sebagai bahasa tertanam yang sederhana, dan di sini “manajemen paket” kurang lebih berarti mengunduh lalu mengekstrak beberapa zip, sedangkan “manajemen versi” lebih seperti memilih apakah akan memakai kompatibilitas 5.1 atau kompatibilitas 5.4