nixos-and-flakes-book/docs/zh/nixos-with-flakes/introduction-to-flakes.md

75 lines
7.4 KiB
Markdown
Raw Normal View History

2023-06-30 11:00:03 +02:00
# Flakes 简介
2023-06-23 14:29:12 +02:00
Flakes 实验特性是 Nix 项目的一项重大进展,它引入了一种管理 Nix 表达式之间的依赖关系的策略,提高了 Nix 生态系统中的可复现性、可组合性和可用性。
2023-06-23 16:41:34 +02:00
虽然 Flakes 仍然是一个试验性的功能,但已经被 Nix 社区广泛采用。[^1]
2023-06-23 14:29:12 +02:00
Flakes 特性是 Nix 项目中最有意义的变化之一。[^2]
2023-07-26 05:48:46 +02:00
简单的说,如果你写过点 JavaScript/Go/Rust/Python那你应该对 `package.json`/`go.mod`/`Cargo.toml`/`pyproject.toml` 这些文件不陌生,
在这些编程语言中,这些文件用来描述软件包之间的依赖关系,以及如何构建项目。
同样的,这些编程语言的包管理器还通过 `package-lock.json`/`go.sum`/`Cargo.lock`/`poetry.lock` 这些文件来锁定依赖的版本,以保证项目的可复现性。
Flakes 就是从上述这类编程语言的包管理器中借鉴了一些思想,以提高 Nix 生态系统中的可复现性、可组合性和可用性。
Flakes 提供了 `flake.nix`,它类似 `package.json`,用来描述 Nix 包之间的依赖关系,以及如何构建项目。
同时它还提供了 `flake.lock`,这是一个类似 `package-lock.json` 的文件,用来锁定依赖的版本,以保证项目的可复现性。
2023-07-08 06:34:34 +02:00
## 注意事项 <Badge type="danger" text="caution" />
2023-06-23 14:29:12 +02:00
2023-06-23 19:17:28 +02:00
Flakes 带来的好处是显而易见的,整个 NixOS 社区都很喜欢它,目前超过半数的用户已经在大量使用 Flakes[^3],因此我们可以相当确定 Flakes 不会被废弃。
2023-06-23 14:29:12 +02:00
2023-07-08 06:34:34 +02:00
:warning:但是 Flakes 目前仍然存在一些问题因此在将它推向稳定的过程中Nix 可能会引入一些不兼容的改动,这个改动的大小目前还无法确定。
2023-06-23 14:29:12 +02:00
2023-06-24 06:24:00 +02:00
总的来说,我仍然推荐大家使用 Flakes毕竟这本书本身也是围绕 NixOS 与 Flakes 编写的,但是也要做好准备——未来可能需要解决一些不兼容变更带来的问题。
2023-06-23 14:29:12 +02:00
## Flakes 与传统的 Nix
Nix 于 2020 年推出了 `nix-command` & `flakes` 两个新特性,它们提供了全新的命令行工具、标准的 Nix 包结构定义、类似 cargo/npm 的 `flake.lock` 版本锁文件等等。这两个特性极大地增强了 Nix 的能力因此虽然至今2023/5/5它们仍然是实验性特性但是已经被 Nix 社区广泛使用。
但由于 `nix-command` & `flakes` 仍然是实验性特性,官方文档基本不包含任何介绍它们的内容,同时社区关于 Flakes 的文档也相当分散且不完整。
但是从可复现、易于管理维护的角度讲,旧的 Nix 包结构与命令行工具已经不推荐使用了,因此本书也不会介绍旧的 Nix 包结构与命令行工具的使用方法,也建议新手直接忽略掉这些旧的内容,从 `nix-command` & `flakes` 学起。
这里列举下在 `nix-command` & `flakes` 中已经不需要用到的旧的 Nix 命令行工具与相关概念,在查找资料时,如果看到它们直接忽略掉就行:
1. `nix-channel`: 与 apt/yum/pacman 等其他 Linux 发行版的包管理工具类似,传统的 Nix 也以 stable/unstable/test 等 channel 的形式来管理软件包的版本,可通过此命令修改 Nix 的 channel 信息。
1. Nix Flakes 在 `flake.nix` 中通过 `inputs` 声明依赖包的数据源,通过 `flake.lock` 锁定依赖版本,完全取代掉了 `nix-channel` 的功能。
2. `nix-env`: 用于管理用户环境的软件包,是传统 Nix 的核心命令行工具。它从 `nix-channel` 定义的数据源中安装软件包,所以安装的软件包版本受 channel 影响。
1. 通过 `nix-env` 安装的包不会被自动记录到 Nix 的声明式配置中,是完全脱离掌控的,无法在其他主机上复现,因此不推荐使用。
2023-07-11 11:22:29 +02:00
2. 在 Nix Flakes 中对应的命令为 `nix profile`,我个人也不太推荐直接使用它.
2023-06-23 14:29:12 +02:00
3. `nix-shell`: nix-shell 用于创建一个临时的 shell 环境
1. 这玩意儿可能有点复杂了,因此在 Nix Flakes 中它被拆分成了三个子命令 `nix develop`, `nix shell` 以及 `nix run`,我们会在「[构建开发环境](../development/intro.md)」一章详细介绍这三个命令。
2023-06-23 14:29:12 +02:00
4. `nix-build`: 用于构建 Nix 包,它会将构建结果放到 `/nix/store` 路径下,但是不会记录到 Nix 的声明式配置中。
1. 在 Nix Flakes 中对应的命令为 `nix build`
2023-07-11 11:22:29 +02:00
5. `nix-collect-garbage`: 垃圾回收指令,用于清理 `/nix/store` 中未被使用的 Store Objects.
1. 在 Nix Flakes 中对应的命令为 `nix store gc --debug`.
6. 以及其他使用地较少的命令,就不一一列出了.
1. 详细的命令对比列表可以看看 [Try to explain nix commands](https://qiita-com.translate.goog/Sumi-Sumi/items/6de9ee7aab10bc0dbead?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=en)
2023-06-23 14:29:12 +02:00
> 可能也就 `nix-env -qa` 这个命令偶尔还会有些用了,它返回当前系统下安装的所有软件包。
2023-12-05 03:20:42 +01:00
## Flakes 入门
我就不多介绍了,请直接参考如下文档:
- [Nix Flakes, Part 1: An introduction and tutorial (Eelco Dolstra, 2020)](https://www.tweag.io/blog/2020-05-25-flakes/)
- [Nix Flakes, Part 2: Evaluation caching (Eelco Dolstra, 2020)](https://www.tweag.io/blog/2020-06-25-eval-cache/)
- [Nix Flakes, Part 3: Managing NixOS systems (Eelco Dolstra, 2020)](https://www.tweag.io/blog/2020-07-31-nixos-flakes/)
- [Practical Nix Flakes](https://serokell.io/blog/practical-nix-flakes)
2023-06-23 14:29:12 +02:00
## Flakes 何时会成为稳定特性? {#when-will-flakes-stablized}
我深入了解了下 Flakes 现状与未来计划相关的资料,大概有这些:
- [[RFC 0136] A Plan to Stabilize Flakes and the New CLI Incrementally](https://github.com/NixOS/rfcs/pull/136): 一份渐进式地将 Flakes 与 new CLI 两个实验性特性推向稳定的 RFC已 Merge.
- [CLI stabilization effort](https://github.com/NixOS/nix/issues/7701): 一份追踪 New CLI 稳定化工作进度的 Issue.
2023-06-23 18:25:52 +02:00
- [Why are flakes still experimental? - NixOS Discourse](https://discourse.nixos.org/t/why-are-flakes-still-experimental/29317): 最近的一次关于 Flakes 稳定性的讨论,可以看到大家的疑惑,以及社区对 Flakes 的态度。
2023-06-23 18:55:40 +02:00
- [Flakes are such an obviously good thing - Graham Christensen](https://grahamc.com/blog/flakes-are-an-obviously-good-thing/): NixOS 社区成员的文章,记录了他对 Flakes 的看法,以及对社区当初添加 Flakes 特性时的不当举措的懊悔。
- [ teaching Nix 3 CLI and Flakes #281 - nix.dev](https://github.com/NixOS/nix.dev/issues/281): 社区关于是否应该在 NixOS 官方文档中介绍 Flakes 的讨论,当前结论是官方文档不应该推广使用 unstable 功能。
2023-06-23 18:25:52 +02:00
- [Draft: 1 year roadmap - NixOS Foundation](https://nixos-foundation.notion.site/1-year-roadmap-0dc5c2ec265a477ea65c549cd5e568a9): NixOS Fundation 的一份 Roadmap其中提到了 Flakes 的计划:`Stabilize flakes and release Nix 3.0. Flakes are widely used (there are more GitHub repos being created with a flake.nix than a default.nix) but theyre still marked as experimental, which is not a good situation. The same applies to the new nix CLI.`
2023-06-23 14:29:12 +02:00
读完上述内容后,个人猜测,**Flakes 可能会在未来一两年内成为稳定特性**。
2023-06-23 18:25:52 +02:00
[^1]: [Flakes - NixOS Wiki](https://nixos.wiki/index.php?title=Flakes)
2023-06-23 14:29:12 +02:00
[^2]: [Flakes are such an obviously good thing](https://grahamc.com/blog/flakes-are-an-obviously-good-thing/)
[^3]: [Draft: 1 year roadmap - NixOS Foundation](https://nixos-foundation.notion.site/1-year-roadmap-0dc5c2ec265a477ea65c549cd5e568a9)