- Lux es un nuevo gestor de paquetes que agrupa la creación, el mantenimiento y la distribución de código Lua en una CLI simple; busca llevar al ecosistema Lua un flujo de desarrollo familiar como el de
cargo - Tras algo más de un año de desarrollo, llegó a un estado muy usable para el trabajo diario, aunque el soporte para MSVC, los mensajes de error y la cobertura de casos límite quedan como tareas pendientes antes del lanzamiento 1.0
- Integra en un solo flujo un modelo de proyecto basado en
lux.toml, generación automática de rockspec, lockfile, builds en paralelo, instalación de headers de Lua, formateo, linting y ejecución de tests - Mantiene la compatibilidad con el ecosistema de Luarocks, pero se enfoca en reducir la carga de compatibilidad heredada, la imprevisibilidad según el sistema y la experiencia lenta de instalación y sincronización
- La distribución de plugins de Neovim y la integración con Nix son sus principales casos de uso; entre los próximos pasos está reescribir
rocks.nvimsobre Lux en lugar de Luarocks
El flujo de gestión de paquetes Lua que ofrece Lux
- Lux es un nuevo gestor de paquetes para la creación, mantenimiento y distribución de código Lua
- La CLI está inspirada en gestores de paquetes conocidos como
cargode Rust - Actualmente alcanzó un nivel “muy usable para el trabajo diario”
- Todavía quedan pendientes el soporte para MSVC, los mensajes de error y la cobertura de casos límite
- Esas correcciones forman parte del plan para el lanzamiento 1.0
Modelo de proyecto e integración de herramientas de desarrollo
- Soporta portabilidad entre sistemas y permite builds e instalaciones en paralelo
- Lux se encarga de instalar los headers de Lua
- Los objetivos soportados son Lua 5.1, 5.2, 5.3, 5.4 y luajit
- Quienes escriben paquetes solo tienen que indicar las versiones de Lua compatibles
- El crate
lux-libes completamente embebible y también puede compilarse para exponer una API Lua - Ofrece un concepto de proyecto centrado en el archivo
lux.toml- Genera automáticamente el rockspec desde
lux.toml - Reduce la carga de mantener manualmente varios archivos rockspec en el repositorio
- Genera automáticamente el rockspec desde
- El lockfile apunta a builds y entornos de desarrollo reproducibles
- Guarda hashes de fuente y hashes de rockspec
- Estos hashes pueden usarse para facilitar la integración de Lux con Nix
- El formateo y el linting de código también están incluidos en la CLI
- Soporta de forma nativa la ejecución de tests basados en
busted- Puede usar Neovim como intérprete de Lua
- Configura un entorno limpio
Diferencias con Luarocks
- Luarocks tiene un alcance amplio, pero unos 20 años de carga de compatibilidad dificultan adaptarlo al desarrollo Lua moderno
- Lux busca empezar de cero y usa TOML como formato principal de manifiesto
- La CLI permite agregar, eliminar, fijar y actualizar dependencias
- En un directorio de proyecto con
lux.toml, comandos comobuildcompilan el proyecto y lo instalan en un árbol local del proyecto - Durante el proceso de build, crea un lockfile de las dependencias del proyecto para poder reproducir las mismas dependencias en sistemas compatibles
- También difiere en cómo fomenta el uso de SemVer
- Luarocks permite versiones arbitrarias después de la versión de parche
- Por ejemplo,
1.0.1.0.0.0.2es válido en Luarocks, pero se considera que no tiene un significado útil - Lux también lo parsea, pero trata los valores posteriores a la versión de parche como una versión preliminar
- Los builds en paralelo están inspirados en Nix store
- Lux hashea los directorios de instalación para evitar conflictos entre paquetes y permitir builds en paralelo sin riesgo de dañar el sistema de archivos
- Los detalles relacionados están en la guía de conflictos de paquetes de Lux
Uso en el ecosistema Neovim
- Tras el soporte de Luarocks en
rocks.nvimylazy.nvim, Luarocks está ganando popularidad como forma de distribuir plugins de Neovim - Sin embargo, el uso actual de Luarocks carece de portabilidad completa y tiene la limitación de que los resultados pueden ser impredecibles según el sistema
- Como Luarocks está escrito en Lua, la instalación de muchos paquetes y la sincronización de plugins de
rocks.nvimeran muy lentas - El uso de Lux no es destructivo y no interfiere con el método actual de distribución de plugins de Neovim basado en Git
- Al usar el flag
--nvim, instala los paquetes en una estructura de árbol compatible con:h packagesde Neovim
Lockfile para la integración con Nix
- Cuando un plugin de Neovim existe como paquete de Luarocks,
nixpkgslo usa como fuente de referencia- Esto se debe a que, en un gestor de paquetes adecuado, la responsabilidad de declarar dependencias recae en quien escribe el paquete
- El soporte de lockfile de Luarocks es básico y no incluye hashes de fuente
- Tanto Luarocks como Lux soportan dependencias en conflicto mediante
luarocks.loader - A nixpkgs le resulta difícil agregar razonablemente varias versiones de una misma dependencia al conjunto de paquetes
- El
lux.lockde Lux guarda el hash de fuente y el hash del rockspec de cada dependencia- Si la URL de fuente es un repositorio Git, Lux guarda un hash NAR
lux.lockpuede usarse, comoCargo.lock, para crear una derivación de salida fija que incluya todas las dependencias
Próximos pasos y documentación
- La prioridad actual es la corrección de bugs y la mejora de los mensajes de error
rocks.nvimserá reescrito para usar Lux internamente en lugar de Luarocks- Esta reescritura busca llevar la velocidad de
rocks.nvimal nivel de otros gestores de plugins - Si tiene éxito, servirá como ejemplo de que Lux puede embeberse en otros lugares
- Como ejemplo se menciona
lazy.nvim, que en el pasado tuvo problemas relacionados con Luarocks
- Esta reescritura busca llevar la velocidad de
- Las personas que lo prueben al inicio pueden consultar tutoriales y guías en el sitio de documentación
- Las preguntas o issues se reciben en GitHub discussions o en el issue tracker
- Lux tiene licencia LGPLv3.0+, y el logo de Lux está bajo licencia CC BY-NC-SA 4.0 de © 2025 Kai Jakobi
1 comentarios
Opiniones de Hacker News
El talón de Aquiles de los lenguajes de scripting es el entorno de ejecución. Personalmente no uso Neovim, pero pensé que la adopción de Neovim impulsaría avances en esta área para Lua.
Bryan Cantrill llamó a JavaScript “LISP con ropa de C”, y en cierto sentido Lua me parece lo contrario, por eso me gusta. Aunque nunca me tocó usarlo en el trabajo.
Tengo entendido que proyectos como Koreader[1] usan Lua como lenguaje principal de la aplicación. Si pudieran convencer a uno de esos proyectos de migrar, eso daría cierta confianza sobre la madurez y popularidad de esta idea.
[1]: https://github.com/koreader/koreader
Se ve realmente bien. Uso mucho Lua, y luarocks tenía una orientación tan marcada que era casi inútil para lo que necesitaba.
Apenas te salías de “instalar bibliotecas para ejecutarlas directamente en el sistema local”, te topabas con una pared desde el inicio. Tenía un entorno de scripting embebido que usaba paquetes Lua, y si quería empaquetar y distribuir scripts junto con sus dependencias, había que rendirse.
No sé si esta herramienta será mejor para ese caso, pero aunque no lo sea, luarocks, siendo generosos, es tosco y molesto de usar.
Proyecto interesante. Me gustaría colaborar para crear un mejor soporte para Lua en Pixi a través del ecosistema conda-forge.
Ya estamos empaquetando lua y algunas extensiones en C. Las extensiones en C son un área central de Pixi, así que creo que podría encajar bien.
Documentación de pixi.sh y paquete lua en el registro: https://prefix.dev/channels/conda-forge/packages/lua
Pregunto porque no lo vi aquí ni en los sitios relacionados: me interesa saber si se integra de forma nativa con
package.pathypackage.cpath, si detecta instalaciones no estándar pero muy usadas como brew(1), y si se puede instalar con el formato de GitHub:user/:repository.El proyecto se ve genial y bien hecho.
lx runylx luaconfiguranPATH,LUA_PATHyLUA_CPATH. También hay un comandolx pathpara configurar esas variables de entorno.La detección de instalaciones de Lua usa pkg-config por defecto y, si no encuentra nada, intenta instalar Lua mediante los crates
lua_srcyluajit_src. Más adelante podríamos agregar soporte para otras herramientas como vcpkg.La instalación de GitHub con
:user/:repositorytodavía no está disponible. Planeamos agregarla alux.toml/la especificación de dependencias, pero probablemente no permitiremos publicar ese tipo de rockspec en luarocks.org. No queremos provocar que la gente suba paquetes que no se puedan compilar con luarocks.¿Entonces un gestor de paquetes para un lenguaje diseñado para embeberse en C y que depende mucho de bibliotecas en C está escrito en Rust, y aunque Lua en sí fue creado como lenguaje de configuración para programas en C, la configuración se hace en TOML?
Paso. Luarocks tiene limitaciones y probablemente habría que reescribirlo, pero debería usarse un lenguaje que encaje con el ecosistema y seguir la cultura del ecosistema Lua. Rust y Cargo están exactamente en el extremo opuesto de Lua.
Personalmente estoy harto de estos gestores de paquetes específicos de cada lenguaje. No se siente como el camino correcto; un enfoque como nix me parece mucho mejor.
Un gestor de paquetes para Lua que depende de Rust.
Me gusta. Desde hace bastante quería tener una forma de hacer instalaciones reproducibles de paquetes Lua en varias máquinas.
Una es en forma “cruda”, vinculándolo a una VM interna y gestionando la base de código
.luacomo parte de la compilación del proyecto; la otra es como herramienta del sistema, usando de manera adecuadaluarocks --local, herramientas como luaenv, integrándolo en Makefile/CMakeLists.txt y mezclando un poco de luastatic para los bundles de distribución.Sinceramente, esto no es muy distinto de Python u otros lenguajes de scripting que pueden ir incluidos. Lo importante es distinguir siempre entre el
/bin/script_languageque provee el sistema y el lenguaje usado como herramienta de desarrollo/motor de scripting dentro de un proyecto más grande, o como herramienta para el entorno local de trabajo.Una de las razones por las que me gusta tanto Lua es que empaquetar bibliotecas, enlazar bytecode, envolver bundles y entregarlos a usuarios del sistema operativo objetivo como una instalación de un clic es bastante fácil y divertido. Claro, requiere algo de trabajo manual.
Es excelente, pero da una fuerte impresión de ir en contra de la dirección de diseño de Lua. Lua fue diseñado como un lenguaje simple para embeber, y aquí “gestión de paquetes” se parece más a descargar y descomprimir algunos zips, mientras que “gestión de versiones” es básicamente elegir si quieres compatibilidad con 5.1 o con 5.4.