- Lux ist ein neuer Paketmanager, der das Erstellen, Pflegen und Verteilen von Lua-Code in einer einfachen CLI bündelt und einen vertrauten Entwicklungsablauf wie bei
cargoins Lua-Ökosystem bringen soll - Nach etwas mehr als einem Jahr Entwicklung hat er einen Zustand erreicht, in dem er für die tägliche Arbeit sehr gut nutzbar ist; MSVC-Unterstützung, Fehlermeldungen und die Behandlung von Edge Cases bleiben jedoch Aufgaben vor dem 1.0-Release
- Er integriert ein Projektmodell auf Basis von
lux.toml, automatische rockspec-Erzeugung, Lockfiles, parallele Builds, die Installation von Lua-Headern sowie Formatierung, Linting und Testausführung in einem durchgängigen Ablauf - Bei gleichzeitiger Kompatibilität mit dem Luarocks-Ökosystem liegt der Fokus darauf, alte Kompatibilitätslasten, systemspezifische Unvorhersehbarkeit sowie langsame Installations- und Synchronisierungserfahrungen zu reduzieren
- Wichtige Einsatzbereiche sind die Verteilung von Neovim-Plugins und die Nix-Integration; zu den nächsten Schritten gehört,
rocks.nvimauf Basis von Lux statt Luarocks neu zu schreiben
Der von Lux bereitgestellte Lua-Paketmanagement-Workflow
- Lux ist ein neuer Paketmanager für das Erstellen, Pflegen und Verteilen von Lua-Code
- Die CLI ist von bekannten Paketmanagern wie Rusts
cargoinspiriert - Der aktuelle Stand ist „für die tägliche Arbeit sehr gut nutzbar“
- MSVC-Unterstützung, Fehlermeldungen und die Behandlung von Edge Cases stehen noch aus
- Diese Korrekturen sind für den 1.0-Release geplant
Projektmodell und Integration von Entwicklungstools
- Unterstützt Portabilität zwischen Systemen und ermöglicht parallele Builds sowie parallele Installationen
- Lux übernimmt die Installation von Lua-Headern
- Unterstützt werden Lua 5.1, 5.2, 5.3, 5.4 und luajit
- Paketautoren müssen nur die kompatiblen Lua-Versionen angeben
- Das
lux-lib-Crate ist vollständig einbettbar und kann auch so gebaut werden, dass es eine Lua-API bereitstellt - Bietet ein Projektkonzept rund um die Datei
lux.toml- Aus
lux.tomlwerden rockspecs automatisch erzeugt - Der Aufwand, mehrere rockspec-Dateien direkt im Repository zu pflegen, wird reduziert
- Aus
- Lockfiles zielen auf reproduzierbare Builds und Entwicklungsumgebungen ab
- Sie speichern Source-Hashes und rockspec-Hashes
- Diese Hashes können genutzt werden, um Lux leichter mit Nix zu integrieren
- Codeformatierung und Linting sind ebenfalls in der CLI enthalten
- Testausführung auf Basis von
bustedwird standardmäßig unterstützt- Neovim kann als Lua-Interpreter verwendet werden
- Es wird eine saubere Umgebung eingerichtet
Unterschiede zu Luarocks
- Luarocks hat einen großen Funktionsumfang, lässt sich wegen der Kompatibilitätslast aus rund 20 Jahren aber nur schwer an moderne Lua-Entwicklung anpassen
- Lux will einen Neustart ermöglichen und verwendet TOML als primäres Manifestformat
- Abhängigkeiten können per CLI hinzugefügt, entfernt, fixiert und aktualisiert werden
- In einem Projektverzeichnis mit
lux.tomlbauen Befehle wiebuilddas Projekt und installieren es in einem projektlokalen Tree - Während des Builds wird ein Lockfile der Projektabhängigkeiten erstellt, sodass sich dieselben Abhängigkeiten auf kompatiblen Systemen reproduzieren lassen
- Auch die Förderung der Nutzung von SemVer unterscheidet sich
- Luarocks erlaubt beliebige Versionsteile nach der Patch-Version
- Zum Beispiel ist
1.0.1.0.0.0.2in Luarocks gültig, wird aber als semantisch wenig nützlich angesehen - Lux parst dies ebenfalls, behandelt Werte nach der Patch-Version jedoch als Prerelease-Version
- Parallele Builds sind vom Nix Store inspiriert
- Lux hasht Installationsverzeichnisse, um Paketkonflikte zu verhindern und parallele Builds ohne Risiko einer Beschädigung des Dateisystems zu ermöglichen
- Weitere Details stehen im Leitfaden zu Paketkonflikten von Lux
Nutzung im Neovim-Ökosystem
- Seit der Luarocks-Unterstützung von
rocks.nvimundlazy.nvimgewinnt Luarocks als Distributionsweg für Neovim-Plugins an Popularität - Die bisherige Nutzung von Luarocks ist jedoch durch fehlende vollständige Portabilität und schwer vorhersehbare Ergebnisse je nach System eingeschränkt
- Da Luarocks in Lua geschrieben ist, waren die Installation vieler Pakete und die Synchronisierung von
rocks.nvim-Plugins sehr langsam - Der Einsatz von Lux ist nicht destruktiv und stört die derzeitige Git-basierte Verteilung von Neovim-Plugins nicht
- Mit dem Flag
--nvimwerden Pakete in einer Tree-Struktur installiert, die mit Neovims:h packageskompatibel ist
Lockfiles für die Nix-Integration
- Wenn ein Neovim-Plugin als Luarocks-Paket vorliegt, verwendet
nixpkgsdieses als maßgebliche Quelle- Denn bei einem geeigneten Paketmanager liegt die Verantwortung für die Deklaration von Abhängigkeiten beim Paketautor
- Die Lockfile-Unterstützung von Luarocks ist grundlegend und enthält keine Source-Hashes
- Sowohl Luarocks als auch Lux unterstützen über
luarocks.loaderkollidierende Abhängigkeiten - Für nixpkgs ist es schwierig, mehrere Versionen derselben Abhängigkeit sinnvoll in ein Paketset aufzunehmen
- Lux’
lux.lockspeichert für jede Abhängigkeit den Source-Hash und den rockspec-Hash- Wenn die Source-URL ein Git-Repository ist, speichert Lux einen NAR hash
lux.lockkann verwendet werden, um eine fixed-output derivation mit allen Abhängigkeiten zu erstellen, ähnlich wieCargo.lock
Nächste Schritte und Dokumentation
- Aktuelle Priorität haben Bugfixes und bessere Fehlermeldungen
rocks.nvimsoll so umgeschrieben werden, dass es intern Lux statt Luarocks verwendet- Diese Neufassung soll die Geschwindigkeit von
rocks.nvimauf das Niveau anderer Plugin-Manager bringen - Bei Erfolg wäre sie ein Beispiel dafür, dass Lux auch anderswo eingebettet werden kann
- Als Beispiel wird
lazy.nvimgenannt, das in der Vergangenheit Probleme im Zusammenhang mit Luarocks hatte
- Diese Neufassung soll die Geschwindigkeit von
- Frühe Nutzer finden Tutorials und Leitfäden auf der Dokumentationsseite
- Fragen oder Issues können über GitHub Discussions oder den Issue Tracker eingereicht werden
- Lux steht unter der Lizenz LGPLv3.0+, und das Lux-Logo ist © 2025 Kai Jakobi unter der Lizenz CC BY-NC-SA 4.0
1 Kommentare
Hacker-News-Kommentare
Die Achillesferse von Skriptsprachen ist die Laufzeitumgebung. Ich persönlich nutze Neovim nicht, aber ich hatte den Eindruck, dass die Verbreitung von Neovim in der Lua-Welt Fortschritte in diesem Bereich vorantreiben könnte.
Bryan Cantrill nannte JavaScript einmal „LISP in C-Kleidung“; in gewisser Hinsicht fühlt sich Lua für mich wie das Gegenteil davon an, und das gefällt mir. Allerdings musste ich es beruflich noch nie einsetzen.
Soweit ich weiß, verwenden Projekte wie Koreader[1] Lua als primäre Anwendungssprache. Wenn man eines dieser Projekte zu einem Wechsel bewegen könnte, würde das sicher ein gewisses Vertrauen in Reife und Popularität dieser Idee schaffen.
[1]: https://github.com/koreader/koreader
Sieht wirklich gut aus. Ich nutze viel Lua, aber luarocks war für das, was ich brauchte, fast unbrauchbar, weil es eine zu starke eigene Ausrichtung hat.
Sobald man auch nur ein wenig über „Bibliotheken installieren, die direkt auf dem lokalen System ausgeführt werden“ hinausgeht, steckt man von Anfang an fest. Wenn man eine eingebettete Scripting-Umgebung hat, die Lua-Pakete nutzt, und Skripte samt Abhängigkeiten bündeln und ausliefern möchte, musste man praktisch aufgeben.
Ich weiß nicht, ob dieses Tool für diesen Zweck besser ist, aber selbst wenn nicht: luarocks ist im besten Fall sperrig und nervig zu benutzen.
Interessantes Projekt. Ich würde gern zusammenarbeiten, um über das conda-forge-Ökosystem in Pixi besseren Lua-Support zu schaffen.
Wir paketieren bereits lua und einige C-Erweiterungen. C-Erweiterungen sind ein Kernbereich von Pixi, daher könnte das gut passen.
Die pixi.sh-Dokumentation und das lua-Paket in der Registry: https://prefix.dev/channels/conda-forge/packages/lua
Da ich es hier oder auf den zugehörigen Seiten nicht gesehen habe, frage ich: Integriert es sich nativ in
package.pathundpackage.cpath, erkennt es nicht standardmäßige, aber weit verbreitete Installationen wie brew(1), und kann man per GitHub-user/:repository-Schema installieren?Das Projekt sieht cool und gut gemacht aus.
lx runundlx luasetzenPATH,LUA_PATHundLUA_CPATH. Außerdem gibt es den Befehllx path, um diese Umgebungsvariablen zu setzen.Die Erkennung von Lua-Installationen nutzt standardmäßig pkg-config; wenn nichts gefunden wird, wird versucht, Lua über die Crates
lua_srcundluajit_srczu installieren. Unterstützung für andere Tools wie vcpkg könnte später hinzukommen.GitHub-Installationen im Stil
:user/:repositorygehen noch nicht. Ich plane, das zulux.tomlbzw. zur Abhängigkeitsdefinition hinzuzufügen, werde aber wohl nicht erlauben, solche rockspecs auf luarocks.org zu veröffentlichen. Ich möchte nicht dazu beitragen, dass Leute Pakete hochladen, die sich mit luarocks nicht bauen lassen.Ein Paketmanager für eine Sprache, die dafür entworfen wurde, in C eingebettet zu werden und stark von C-Bibliotheken abhängt, wird in Rust geschrieben; und Lua selbst wurde als Konfigurationssprache für C-Programme geschaffen, aber die Konfiguration erfolgt in TOML?
Nein danke. Luarocks hat Grenzen und sollte vermutlich neu geschrieben werden, aber man sollte eine Sprache verwenden, die zum Ökosystem passt, und der Kultur des Lua-Ökosystems folgen. Rust und Cargo stehen Lua diametral gegenüber.
Ich persönlich bin diese sprachspezifischen Paketmanager ziemlich leid. Es fühlt sich nicht nach der richtigen Richtung an; ein Ansatz wie nix wirkt deutlich besser.
Ein Paketmanager für Lua, der von Rust abhängt.
Gefällt mir. Ich wollte schon seit geraumer Zeit eine Möglichkeit für reproduzierbare Lua-Paketinstallationen auf mehreren Maschinen haben.
einmal „roh“, indem ich es in eine interne VM linke und die
.lua-Codebasis als Teil des Projekt-Builds verwalte; und einmal als System-Tool, wobei ichluarocks --local, luaenv und ähnliche Werkzeuge passend einsetze, sie in Makefile/CMakeLists.txt integriere und für Distributions-Bundles noch etwas luastatic dazumische.Ehrlich gesagt unterscheidet sich das nicht wesentlich von Python oder anderen Skriptsprachen, die mitgeliefert werden können. Man muss nur immer zwischen dem vom System bereitgestellten
/bin/script_languageund einer Sprache unterscheiden, die innerhalb eines größeren Projekts als Entwicklungswerkzeug/Scripting-Engine oder als Tool für den lokalen Arbeitsplatz dient.Einer der Gründe, warum ich Lua wirklich mag, ist, dass es ziemlich einfach und unterhaltsam ist, Bibliotheken zu paketieren, Bytecode zu linken und Bundles zu schnüren, die man Nutzern des Zielbetriebssystems als Ein-Klick-Installation bereitstellen kann. Natürlich muss man dafür schon ein bisschen selbst Hand anlegen.
Es ist zwar großartig, aber es fühlt sich stark so an, als gehe es gegen die Designrichtung von Lua. Lua wurde als einfache Einbettungssprache entworfen; „Paketverwaltung“ bedeutet hier eher, ein paar ZIP-Dateien herunterzuladen und zu entpacken, und „Versionsverwaltung“ eher, zu wählen, ob man 5.1-kompatibel oder 5.4-kompatibel arbeiten will.