以有趣的方式学习 Flakes

这是一篇关于 Nix Flakes 的文章,主要内容如下:

  • 重写文章并介绍 Flakes:作者基于Learn Nix the Fun Way on fzakaria.com进行了重写,以 Nix 用户的角度展示 Flakes 的用法,虽增加了步骤和复杂度,但仍有价值。
  • 单个示例:what-is-my-ip 脚本:通过一个获取 IP 地址的 shell 脚本what-is-my-ip,展示了在 Nix Flakes 中的实现。包括使用 Nixpkgs 的 trivial builders 构建 Nix 派生(构建配方),以及在不同系统上的构建和运行。

    • 保证可移植性:Nix 保证了脚本的可移植性,通过固定依赖来自 NixOS/Nixpkgs 24.05 版本的包来实现。
    • 生成依赖图:可以将构建的包放入 Nix 存储中,生成依赖图,如nix-store --query --graph $(readlink result) | nix shell nixpkgs#graphviz -c dot -Tpng -o what-is-my-ip-deps.png
    • 开发者环境:添加开发者环境,包含新工具,如devShells,可以创建可重现工具的开发环境,且哈希值与之前构建的相同。
    • 部署:可以进行二进制或源代码部署,将必要的/nix/store路径复制到其他安装了 Nix 的机器上,或者使用 Nix 创建 OCI 兼容的镜像,如docker load < $(nix build.#container --print-out-paths),还可以创建包含所需程序的可重现操作系统,如 NixOS VM。
  • Flakes 作为各种包管理:Flakes 可以在任何地方使用,如运行 Flake 的包nix run git+https://git.lyte.dev/lytedev/learn-flakes-the-fun-way,进入 Flake 的开发环境nix develop git+https://git.lyte.dev/lytedev/learn-flakes-the-fun-way -c $SHELL,加载 Flake 的 Docker 镜像并运行docker load < $(nix build git+https://git.lyte.dev/lytedev/learn-flakes-the-fun-way#container --print-out-paths),运行 Flake 的 NixOS 配置作为虚拟机nixos-rebuild build-vm --flake git+https://git.lyte.dev/lytedev/learn-flakes-the-fun-way#default等。
  • Flakes 作为输入:Flakes 可以将其他 Flake 作为输入,实现很好的组合。可以使用作者提供的模板生成自己的 Flake,并添加教程中的包。
  • 其他 Flakey 工具:可以利用direnv风格的设置,在进入目录时进入开发环境,Flakes 还有checks用于 CI 确保 Flake 能够构建所需的包或检查代码格式等。
  • 结论:希望展示的 Nix 的有趣用法能激励读者克服困难,在 Nix Flakes 的世界中找到乐趣和价值。
阅读 18
0 条评论