首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

一颗尼克斯碎片统治他们所有人

摘要

Flakes are undoubtedly here to stay, and I’ve made my opinion on them well-known: they are “meh”. Despite their ever-presence, adding a flake input continues to be a small annoyance that never goes aw...

you flake the omniflake flakes and that nixpkgs inputs are
2026-08-30 1 阅读 约9分钟阅读 ingve
分享:
字号:
毫无疑问,薄片会留下来,我对它们的看法众所周知:它们“meh”。尽管它们一直存在,但添加薄片输入仍然是一个永远不会消失的小烦恼。薄片联合被吹捧为一个积极的特性,但现实是我想要集中式薄片的简单性。这就是 nixpkgs 的美丽和力量。过程是:您想要 disco ,因此您添加一个 url ,然后添加一个 ,以便它停止拖动自己的 nixpkgs ,然后您为下一个再次执行此操作。这已经成为 Nix 社区中关于每个 flake 如何拖入自己的 flake-utils 的模因。我拒绝接受这种用户体验。所以我想知道:是否可以用一片薄片承载所有其他薄片,而你只需伸手去拿你需要的任何东西? 🤯 § Omniflakeomniflake 是一个薄片输入背后有数千个 Nix 薄片。输入 .全片。 url = "github:fzakaria/omniflake" ;输入 .全片。输入 .尼克斯包装。接下来=“nixpkgs”;一旦你有了omniflake,你就可以像任何其他输入一样使用它。 shell 中或系统上的包: 环境 。系统包= [omniflake。薄片。嗯。包裹。 ${系统}。默认 ];覆盖: nixpkgs 。覆盖= [omniflake。薄片。锈层。叠加。默认 ]; NixOS 模块:imports = [omniflake .薄片。迪斯科。 nixos 模块。迪斯科];或者直接从命令行直接在 flake 中什么都没有: $ nix run 'github:fzakaria/omniflake#flakes.nh.packages.x86_64-linux.default' -- --version 它有一个可访问的网站,您可以访问 https://omniflake.com/ 查看它携带的 flakes 列表以及一些有用的文档。添加后,您可以访问近一万二千个薄片,截至撰写本文时,您可以根据需要懒惰地访问它们。您只需为您使用的内容付费。这听起来很荒谬,但确实有效。具有数千个输入的 flake 应该无法使用,但由于 Nix 语言的惰性和 flake 锁定机制,它可以完美地工作。怎么可能将几乎所有的薄片都包含在其中? § 关于 flake 的简短入门 flake 是一个带有 flake.nix 的目录,它声明了两件事:输入(它依赖的其他 flake)和输出(这些输入的函数)。 { 输入 .尼克斯包装。 url = "github:NixOS/nixpkgs/nixos-unstable" ;输出 = { self , nixpkgs }: { 包 . x86_64-linux 。你好= nixpkgs 。遗留包。 x86_64-linux 。你好 ; };输入松散地说明了您所依赖的内容:“nixos-unstable”是一个移动分支。它旁边的 flake.lock 准确地说明了解析到的提交,因此构建是可重现的。它是 npm 的 package-lock.json 或 Cargo.lock 。锁定文件不仅仅固定您自己的输入。它为每个薄片固定整个传递图。这意味着如果两个子 flake 都依赖于 nixpkgs ,它们将在锁定文件中拥有自己的 nixpkgs 副本,并且它们可能是不同的提交。 { "nodes" : { "root" : { "inputs" : { "agenix" : "agenix" , "nixpkgs" : "nixpkgs" } }, "agenix" : { "inputs" : { "home-manager" : "home-manager" }, "locked" : { "rev" : "5182..." , "type" : "github" } }, "home-manager" : { "inputs" : { "nixpkgs" : "nixpkgs_2" }, ... }, "nixpkgs" : { "locked" : { "rev" : "9fbb..." , "type" : "github" } }, "nixpkgs_2" : { "locked" : { "rev" : "50ab..." , "type" : "github" } } } } 在此示例中,有两个 nixpkg : nixpkgs 和 nixpkgs_2 。这是每个人都抱怨的重复,这就是 follow 存在的原因: follow 重写依赖项以指向您已有的节点,而不是获取另一个副本。这样做可以减少图形大小,但它不再针对作者测试的确切 nixpkgs 进行构建。这是一个简单的薄片,它使用以下内容来统一 nixpkgs: { input = { nixpkgs 。 url = "github:NixOS/nixpkgs/nixos-unstable" ;迪斯科。 url = "github:nix-community/disko" ;迪斯科。输入 .尼克斯包装。接下来=“nixpkgs”;阿吉尼克斯。 url = "github:ryantm/agenix" ;阿吉尼克斯。输入 .家庭经理 .输入 .尼克斯包装。接下来=“nixpkgs”; };跟随你 your flake disco disco you->disko agenix agenix you->agenix npkgs nixpkgs disco->npkgs 跟随 hm home-manager agenix->hm hm->npkgs 实线箭头是输入;虚线表示折叠到一个共享 nixpkg 上的边缘。 § 输入是惰性的 Nix 的许多疯狂之处在于它是一种惰性语言。永远不会获取没有输出触及的输入。您可以破坏性地证明这一点:用两个输入锁定一个 flake,然后破坏 flake.lock 中的一个条目,使其无法解析。 $ sed -i 's/2810303efc.../0000000000000000000000000000000000000000/' flake.lock $ nix eval .#justB [ "aarch64-darwin" "aarch64-linux" "x86_64-darwin" "x86_64-linux" ] 对于包含不存在修订版的锁,该评估结果良好。仅强制中毒输入抱怨: $ nix eval .#useA error: unavailable to download '.../0000000000000000000000000000000000000000.tar.gz': HTTP error 404 当您添加一个薄片作为输入时,其整个传递图会作为元数据复制到您的锁中,而不是
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱