GuixPkgs:每个 Guix 包,作为 Nix flake
摘要
GuixPkgs 是一个项目,它将每个 GNU Guix 包以 Nix flake 的形式提供,使用户能够在单个 flake 中混合使用 Guix 和 Nixpkgs 包。它使用 guix-transfer 将 Guix 派生转换为 Nix 派生,并提供二进制缓存以避免完全重建 Guix 引导过程。
<p><a href="https://lobste.rs/s/rm7qnt/guixpkgs_every_guix_package_as_nix_flake">评论</a></p>
查看缓存全文
缓存时间: 2026/06/26 14:09
# GuixPkgs:每个 Guix 包,作为一个 Nix flake
来源:https://fzakaria.com/2026/06/25/guixpkgs-every-guix-package-as-a-nix-flake
发布于 2026\-06\-25,Farid Zakaria 的博客 (https://fzakaria.com/)
GuixPkgs 标志
我之前写过一篇关于我认为是*荒诞想法*的文章:[The Guix Nix Abomination](https://fzakaria.com/2026/06/05/the-guix-nix-abomination-leveraging-guix-derivations-in-nix):一个工具,`guix-transfer` (https://github.com/fzakaria/guix-transfer),它能够获取**任何** Guix 派生并将其重写为 Nix 派生,并让 `nix-daemon` 来构建它。
有了这个基本工具,我思考了将**整个 Guix 包集**导入到 Nix 中意味着什么。
> 这意味着我们甚至能够构建一个包含所有 Guix 包的 `flake`,供我们使用。
那么…… 你好,GuixPkgs (https://github.com/fzakaria/guixpkgs) 🤯
Nixpkgs (https://github.com/NixOS/nixpkgs) 是世界上最著名的最大包仓库。GuixPkgs 通过包含*整个* GNU Guix 包集而使其更大,这样你就可以在同一个 flake 中混合使用 Guix 和 Nixpkgs 的包。
```
{
description = "一个混合使用 Nix 和 Guix 的项目";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
guixpkgs.url = "github:fzakaria/guixpkgs";
};
outputs = { self, nixpkgs, guixpkgs }:
let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
guixPkgs = guixpkgs.packages.${system};
in {
devShells.${system}.default = pkgs.mkShell {
buildInputs = [
pkgs.git # 来自 Nixpkgs
guixPkgs.hello # 来自 Guix,通过 GuixPkgs
];
};
};
}
```
```
❯ nix build github:fzakaria/guixpkgs#hello
❯ ./result/bin/hello
Hello, world!
```
☝ 别忘了,那个 `hello` 是从 Guix 的源码引导构建的——从 357 字节的种子一直构建到 GCC 和 glibc,但它最终落到了 `/nix/store` 中,行为就像任何其他 Nix 包一样。消费方无需安装 `guix`。
这只是一个玩笑,还是有什么实际价值呢?
嗯,有些包只存在于 Guix 中,特别是许多基于 GNU Guile 构建的软件,比如 [guile-png](https://github.com/artyom-poptsov/guile-png),现在可以轻松地在 Nix 中使用。🤷
它是如何工作的?
1. 固定一个 Guix 提交,并使用 `guix time-machine` 从*那个特定的* Guix 获取派生,从而将结果与宿主机上安装的 `guix-daemon` 版本解耦。
2. 导出每个包的 `.drv` 文件,并将它们喂给 `guix-transfer --disable-tests --emit-nix-dir pkgs`。
3. 重新构建 `by-name/` 索引,并将 Guix 频道 + 提交 + 时间戳记录在 `guix-metadata.json` 中。
在 Nix 中实现一个 Guix 包意味着重新编译 Guix 的**整个源码引导链**。这需要*几个小时*才能完成每个闭包。为了跳过这个过程,GuixPkgs 提供了一个 [Cachix](https://www.cachix.org/) 二进制缓存,`cachix use guixpkgs`,它已经被包含在 flake 中。感谢 [@domenkozar](https://github.com/domenkozar) 为我赞助了额外的存储空间。🙏
接下来呢?
我们现在可以做一些真正可怕邪恶的事情了。比如,创建一个 overlay,将 Nixpkgs 中的每个包替换为 Guix 中存在的对应包?😈
然后我们可以构建一台 NixOS 机器,其中每个包都是 Guix 的等价物 😱。
这个项目是在 [TacoSprint](https://tacosprint.org/) 期间进行的一个非常有趣的项目。
taco sprint 团队合影 (https://fzakaria.com/assets/images/tacosprint_group.jpg)
---
改进此页面 @ 9991133 (https://github.com/fzakaria/fzakaria.com/tree/9991133c6c9f27b84bc88507a892529b137df450/_posts/2026-06-25-guixpkgs-every-guix-package-as-a-nix-flake.md) 本网站内容采用 [CC-BY-SA](https://creativecommons.org/licenses/by-sa/2.0/) 许可。
相似文章
Nix Flakes 及其在 Guix 中的对应物
详细比较 Nix Flakes 与 Guix 包管理系统中的对应物,涵盖依赖声明、锁定、纯净性、输出、开发环境和系统配置。
Guix Nix 的怪异融合:在 Nix 中利用 Guix 派生
一项技术探索,展示了 Nix 如何构建 Guix 派生项,强调了共享底层“输入输出机”架构以及跨生态系统互操作的可能性。
删除我的 Nix Flakes 与 Guix 对比帖子
作者删除了他们关于比较 Nix Flakes 和 Guix 等效物的人气博文,此前 Andrew Tropin 指责其使用 LLM 撰写该文。作者表示十分沮丧,并决定移除该帖子。
Guix: 从二进制创建包
使用copy-build-system从二进制创建Guix包的指南,解释如何设置安装计划。
使用Nix的开发环境:四个快速示例
本教程演示了使用Nix设置开发环境的四种方法,包括交互式一次性使用、配置文件以及密封的Nix Flakes,并以GoCV和OpenCV为例。