Show HN: Lux - 一款豪华的 Lua 包管理器
mrcjkb.dev Home About Contact CV Archive
隆重推出 Lux - 一款豪华的 Lua 包管理器
发布于 2025年4月7日
是时候给 Lua 配备它应有的生态系统了!
一年多以来,我们一直在开发 Lux,这是一个用于创建、维护和发布 Lua 代码的全新包管理器。它通过一个简单直观的 CLI 来实现,该 CLI 的灵感来源于其他知名的包管理器,例如 cargo
。
今天,我们认为该项目已经达到了“非常适合日常使用”1 的状态。
特性
- 完全跨系统可移植。
- 并行构建和安装。🚀
- 自动处理 Lua 头的安装2。无需再担心用户抱怨系统上安装了错误的 Lua 头。您只需指定兼容的 lua 版本即可。
- 一个完全可嵌入的
lux-lib
crate,甚至可以构建以公开 Lua API。 - 真正拥有“项目”的概念,带有一个简单的控制文件
lux.toml
。- 使用
lux.toml
自动生成 rockspec。告别管理仓库中 10 个不同的 rockspec 文件。🎉
- 使用
- 强大的 lockfile 支持。
- 完全可重现的构建和开发者环境。
- 源代码 + rockspec 哈希值,可用于轻松将 Lux 与 Nix 集成。
- 集成代码格式化 (
lx fmt
) 和 linting (lx check
) 功能,由stylua
和luacheck
提供支持。 - 原生支持使用
busted
运行测试。- 包括使用 Neovim 作为 Lua 解释器的能力。
- 设置纯净环境。
- 兼容 luarocks 生态系统。
- 如果您有一个复杂的 rockspec,不想重写为 TOML,lux 允许您创建一个
extra.rockspec
文件,这样一切都可以正常工作。 - 需要安装一个使用自定义 luarocks 构建后端的包?Lux 可以安装 luarocks 并 shell out 到它进行构建步骤,同时以原生方式管理依赖项。
- 如果您有一个复杂的 rockspec,不想重写为 TOML,lux 允许您创建一个
动机
Lua
虽然 Luarocks 功能广泛,但它也带有大约 20 年的包袱,这使得它难以适应现代 Lua 开发,同时保持向后兼容性。
使用 Lux,我们正在推动一个新的开始:
- 项目的概念:
- 使用 TOML 作为主要的 manifest 格式,您可以轻松地使用 CLI 添加、删除、固定和更新依赖项。
- 如果您在项目目录中(带有
lux.toml
),像build
这样的命令将构建您的项目,并将其安装到项目本地的树中。 - 构建将生成项目依赖项的 lockfile,允许您在任何兼容的系统上重现您的确切依赖项。
- 强制执行 SemVer: Luarocks 允许在补丁版本之后使用任意版本。例如,
1.0.1.0.0.0.2
被 Luarocks 认为是有效的,但它没有实际意义。Lux 也会解析它,但会将补丁版本之后的所有内容视为预发布版本。我们做出这个决定是因为我们希望鼓励包维护者坚持 SemVer 来发布他们的版本。 - 并行构建: 受 Nix 商店的启发,Lux 对3安装目录进行哈希处理,以防止包冲突,并实现高度并行的构建,而不会冒文件系统损坏的风险。
Neovim
感谢我们的 Neovim 插件管理器 rocks.nvim
,以及后来 lazy.nvim
对 Luarocks 的支持,Luarocks 作为一种分发插件的方式,在 Neovim 领域稳步普及。但是,由于它不是完全可移植的,并且在系统与系统之间具有不可预测性,因此受到了严重阻碍。由于 Luarocks 是用 Lua 编写的,因此安装大量软件包并使用 rocks.nvim
同步插件的速度非常慢。
借助 Lux,我们希望插件将开始将自身视为 Lua 项目。使用 Lux 是非破坏性的,并且不会干扰当前分发 Neovim 插件的方式(通过 git)。
实际上,Lux 有一个 --nvim
标志,它告诉它将软件包安装到与 Neovim 的 :h packages
兼容的树结构中。
Nix
如果一个 Neovim 插件以 Luarocks 包的形式存在,那么 nixpkgs
将使用它作为事实来源。这主要是因为使用适当的包管理器,声明依赖项的责任是包作者的责任。但是,Luarocks 的 lockfile 支持非常基本,不包括源哈希值。虽然 Luarocks (与 Lux 一样) 通过其 luarocks.loader
支持冲突的依赖项,但 nixpkgs 无法合理地将同一依赖项的多个版本添加到其软件包集中。Lux 的 lux.lock
存储每个依赖项的源和 rockspec 哈希值。如果源 URL 是一个 git 仓库,lux 将存储一个 NAR hash。这意味着 lux.lock
可以用于创建一个带有所有依赖项的 fixed-output derivation
,就像你可以使用 Cargo.lock
一样。
下一步
目前,我们的首要任务是消除错误并改进错误消息。很快,我们将重写 rocks.nvim
,使其在底层使用 Lux 而不是 Luarocks。这应该使 rocks.nvim 在速度方面赶上其他插件管理器,并使其比以前更加稳定。如果重写成功,那么这对 Neovim 生态系统来说是个好消息,因为它意味着 Lux 也可以嵌入到其他地方(例如 lazy.nvim,过去在 luarocks 方面遇到过麻烦)!
文档
如果您想尽早加入 Lux 的行列,请访问 我们的文档网站。您可以在那里找到教程和指南。
如果您有任何问题或疑虑,请随时在 GitHub discussions 或 我们的 issue tracker 中与我们联系。干杯!:)
Lux 团队
许可
- Lux 在 MIT 许可下发布。
- Lux logo © 2025 by Kai Jakobi 在 CC BY-NC-SA 4.0 许可下发布。
- 我们仍然有一些需要完善的地方,例如 MSVC 支持、错误消息和边缘情况,但所有这些修复都计划在 1.0 版本中进行。↩︎
- Lua 5.1, 5.2, 5.3. 5.4 和 luajit。↩︎
- 有关详细信息,请参阅 我们的指南。↩︎
Site proudly generated by Hakyll