Show HN: Lux - Lua के लिए उन्नत Lua पैकेज मैनेजर
(mrcjkb.dev)- Lux एक नया पैकेज मैनेजर है जो Lua code के निर्माण, रखरखाव और deployment को एक सरल CLI में जोड़ता है; यह
cargoजैसे परिचित development flow को Lua ecosystem में लाने का tool है - एक साल से थोड़ा अधिक development के बाद यह रोज़मर्रा के कामों के लिए बहुत उपयोगी स्थिति में पहुंच गया है, लेकिन MSVC support, error messages और edge cases में सुधार 1.0 release से पहले बाकी हैं
- यह
lux.toml-आधारित project model, automatic rockspec generation, lockfile, parallel builds, Lua header installation, और formatting·linting·test execution को एक flow में integrate करता है - Luarocks ecosystem के साथ compatibility बनाए रखते हुए, यह पुराने compatibility burden, system-specific unpredictability, और धीमे install·sync experience को कम करने पर केंद्रित है
- Neovim plugin distribution और Nix integration इसके मुख्य use cases हैं, और
rocks.nvimको Luarocks के बजाय Lux-आधारित रूप में rewrite करना अगले चरणों में शामिल है
Lux द्वारा दिया जाने वाला Lua package management flow
- Lux Lua code के creation, maintenance और distribution के लिए नया package manager है
- CLI, Rust के
cargoजैसे जाने-पहचाने package managers से प्रेरित है - फिलहाल यह “रोज़मर्रा के कामों के लिए बहुत उपयोगी” स्तर तक पहुंच गया है
- MSVC support, error messages और edge cases में सुधार अभी बाकी है
- ये fixes 1.0 release plan में शामिल हैं
Project model और development tools integration
- यह systems के बीच portability support करता है, और parallel build व parallel installation संभव हैं
- Lua headers की installation Lux संभालता है
- supported targets Lua 5.1, 5.2, 5.3, 5.4, luajit हैं
- package authors को केवल compatible Lua versions specify करने होते हैं
lux-libcrate पूरी तरह embeddable है, और इसे Lua API expose करने के लिए भी build किया जा सकता है- यह
lux.tomlfile पर केंद्रित project concept देता हैlux.tomlसे rockspec अपने-आप generate होता है- repository में कई rockspec files को सीधे manage करने का बोझ कम होता है
- lockfile का लक्ष्य reproducible builds और development environments हैं
- यह source hash और rockspec hash store करता है
- इन hashes का उपयोग Lux को Nix के साथ integrate करना आसान बनाने में किया जा सकता है
- Code formatting और linting भी CLI में शामिल हैं
bustedbased test execution को default support है- Neovim को Lua interpreter के रूप में इस्तेमाल किया जा सकता है
- यह clean environment configure करता है
Luarocks से अंतर
- Luarocks का scope व्यापक है, लेकिन करीब 20 साल के compatibility burden के कारण इसे modern Lua development के अनुरूप बनाना मुश्किल है
- Lux fresh start का लक्ष्य रखता है, और TOML को main manifest format के रूप में उपयोग करता है
- CLI से dependencies add, remove, pin और update की जा सकती हैं
lux.tomlवाले project directory मेंbuildजैसे commands project को build करते हैं और project-local tree में install करते हैं- build process के दौरान project dependencies का lockfile बनता है, ताकि compatible systems पर वही dependencies reproduce की जा सकें
- SemVer के उपयोग को encourage करने का तरीका भी अलग है
- Luarocks patch version के बाद arbitrary versions allow करता है
- उदाहरण के लिए
1.0.1.0.0.0.2Luarocks में valid है, लेकिन इसे useful meaning वाला नहीं माना जाता - Lux भी इसे parse करता है, लेकिन patch version के बाद की values को prerelease version के रूप में treat करता है
- Parallel build Nix store से प्रेरित है
- Lux install directory को hash करता है ताकि package conflicts रुकें, और filesystem corruption के जोखिम के बिना parallel builds संभव हों
- संबंधित details Lux की package conflict guide में हैं
Neovim ecosystem में उपयोग
rocks.nvimऔरlazy.nvimके Luarocks support के बाद, Luarocks Neovim plugin distribution method के रूप में लोकप्रिय हो रहा है- हालांकि मौजूदा Luarocks use में पूरी portability की कमी है, और system के हिसाब से results predict करना कठिन है
- Luarocks Lua में लिखा होने के कारण कई packages install करना और
rocks.nvimplugins sync करना बहुत धीमा था - Lux का उपयोग non-destructive है, और Neovim plugins की मौजूदा Git-based distribution method में बाधा नहीं डालता
--nvimflag का उपयोग करने पर packages को Neovim के:h packagesके compatible tree structure में install किया जाता है
Nix integration के लिए lockfile
- जब Neovim plugin Luarocks package के रूप में मौजूद होता है, तो
nixpkgsउसे reference source के रूप में उपयोग करता है- क्योंकि उपयुक्त package manager में dependency declaration की जिम्मेदारी package author की होती है
- Luarocks का lockfile support basic है और इसमें source hash शामिल नहीं होता
- Luarocks और Lux दोनों
luarocks.loaderके जरिए conflicting dependencies support करते हैं - nixpkgs के लिए एक ही dependency के कई versions को package set में समझदारी से add करना कठिन है
- Lux का
lux.lockहर dependency का source hash और rockspec hash store करता है- अगर source URL Git repository है, तो Lux NAR hash store करता है
lux.lockका उपयोगCargo.lockकी तरह सभी dependencies सहित fixed-output derivation बनाने में किया जा सकता है
अगले कदम और documentation
- मौजूदा priority bug fixes और error messages में सुधार है
rocks.nvimको Luarocks के बजाय अंदरूनी तौर पर Lux इस्तेमाल करने के लिए rewrite किया जाएगा- इस rewrite का लक्ष्य
rocks.nvimकी speed को दूसरे plugin managers के स्तर तक लाना है - सफल होने पर यह दिखाने वाला case होगा कि Lux को अन्य जगहों पर भी embed किया जा सकता है
- उदाहरण के तौर पर
lazy.nvimका उल्लेख है, जिसमें पहले Luarocks-related issues थे
- इस rewrite का लक्ष्य
- शुरुआती users documentation site पर tutorials और guides देख सकते हैं
- सवाल या issues GitHub discussions या issue tracker पर भेजे जा सकते हैं
- Lux LGPLv3.0+ license के तहत है, और Lux logo © 2025 Kai Jakobi के CC BY-NC-SA 4.0 license के तहत है
1 टिप्पणियां
Hacker News टिप्पणियां
scripting languages की Achilles heel execution environment होती है। मैं व्यक्तिगत रूप से Neovim इस्तेमाल नहीं करता, लेकिन लगा था कि Neovim अपनाए जाने से Lua में इस क्षेत्र का विकास आगे बढ़ेगा
Bryan Cantrill ने JavaScript को “C के कपड़े पहना LISP” कहा था; कुछ मायनों में Lua उसका उल्टा लगता है, और इसलिए मुझे पसंद है। हालांकि काम में इसे इस्तेमाल करना कभी नहीं पड़ा
मेरी जानकारी में Koreader[1] जैसे प्रोजेक्ट Lua को मुख्य application language के रूप में इस्तेमाल करते हैं। अगर ऐसे किसी प्रोजेक्ट को migrate करने के लिए राज़ी किया जा सके, तो इस idea की maturity और popularity पर कुछ भरोसा मिल सकता है
[1]: https://github.com/koreader/koreader
वाकई अच्छा लग रहा है। मैं Lua काफी इस्तेमाल करता हूं, और luarocks इतना ज्यादा opinionated है कि जिन कामों के लिए मुझे चाहिए था, उनमें लगभग बेकार साबित हुआ
“local system पर सीधे चलाने के लिए libraries install करना” से थोड़ा भी आगे जाते ही शुरुआत में ही अटक जाता है। अगर आपके पास Lua packages इस्तेमाल करने वाला embedded scripting environment है और आप dependencies के साथ scripts को bundle करके distribute करना चाहते हैं, तो हार माननी पड़ती थी
नहीं पता कि यह tool उस use case के लिए बेहतर है या नहीं, लेकिन भले न हो, luarocks best case में भी rough है और इस्तेमाल करने में चिढ़ाता है
दिलचस्प project है। Pixi में conda-forge ecosystem के जरिए बेहतर Lua support बनाने पर साथ काम करना चाहूंगा
हम पहले से lua और कुछ C extensions package कर रहे हैं। C extensions Pixi का core area हैं, इसलिए यह अच्छा fit हो सकता है
pixi.sh docs और registry में lua package: https://prefix.dev/channels/conda-forge/packages/lua
यहां या related site पर नहीं दिखा, इसलिए पूछ रहा हूं: क्या यह
package.pathऔरpackage.cpathके साथ natively integrate होता है, क्या brew(1) जैसे non-standard लेकिन widely used installations detect करता है, और क्या GitHub:user/:repositoryतरीके से install किया जा सकता है?project शानदार और अच्छी तरह बनाया हुआ लगता है
lx runऔरlx luacommandsPATH,LUA_PATH,LUA_CPATHset करते हैं। और उन environment variables को set करने के लिएlx pathcommand भी हैLua installation detection default रूप से pkg-config इस्तेमाल करता है, और अगर नहीं मिलता तो
lua_srcऔरluajit_srccrates से Lua install करने की कोशिश करता है। बाद में vcpkg जैसे दूसरे tools का support भी जोड़ा जा सकता हैGitHub
:user/:repositoryinstallation अभी नहीं है।lux.toml/dependency spec में जोड़ने की योजना है, लेकिन उस तरीके के rockspec को luarocks.org पर publish करने की शायद अनुमति नहीं देंगे। क्योंकि मैं ऐसा कारण नहीं बनना चाहता कि लोग ऐसे packages upload करें जिन्हें luarocks से build नहीं किया जा सकताC में embed होने के लिए designed और C libraries पर बहुत निर्भर language के लिए package manager Rust में लिखा गया है, और Lua खुद C programs की configuration language के रूप में बना था, लेकिन configuration TOML में होगी?
नहीं चाहिए। Luarocks की सीमाएं हैं और शायद इसे फिर से लिखना चाहिए, लेकिन ecosystem के अनुकूल language इस्तेमाल करनी चाहिए और Lua ecosystem की culture का पालन करना चाहिए। Rust और Cargo, Lua के ठीक opposite side पर हैं
व्यक्तिगत रूप से मैं ऐसे language-specific package managers से बहुत ऊब चुका हूं। यह सही दिशा नहीं लगती, और nix जैसा approach कहीं बेहतर लगता है
Rust पर depend करने वाला Lua package manager
पसंद आया। काफी समय से कई machines पर reproducible Lua package installations का तरीका चाहता था
एक “raw” रूप में, internal VM में link करके project build के हिस्से के रूप में
.luacodebase manage करना; और दूसरा system tool के रूप में इस्तेमाल करते हुएluarocks --local, luaenv जैसे tools को ठीक से Makefile/CMakeLists.txt में डालना, और distribution bundle के लिए luastatic थोड़ा मिलानासच कहूं तो यह Python या साथ में ship की जा सकने वाली दूसरी scripting languages से बहुत अलग नहीं है। बस system-provided
/bin/script_languageऔर किसी बड़े project के अंदर development tool/scripting engine या local workbench tool के रूप में इस्तेमाल की जाने वाली language को हमेशा अलग रखना चाहिएLua को सचमुच पसंद करने की एक वजह यह है कि libraries को package करना, bytecode link करना, और bundle wrap करके target operating system users को one-click install के रूप में देना काफी आसान और मजेदार है। बेशक, कुछ हाथ-पैर तो चलाने पड़ते हैं
बढ़िया तो है, लेकिन Lua की design direction के उलट जाने का एहसास काफी मजबूत है। Lua को एक सरल embedding language के रूप में design किया गया था, और यहां “package management” कुछ zip files download करके extract करने जैसा है, जबकि “version management” लगभग यह चुनने जैसा है कि 5.1-compatible इस्तेमाल करना है या 5.4-compatible