使用Nix的开发环境:四个快速示例

Michael Stapelberg 工具

摘要

本教程演示了使用Nix设置开发环境的四种方法,包括交互式一次性使用、配置文件以及密封的Nix Flakes,并以GoCV和OpenCV为例。

<p>我想在我的一个项目中使用<a href="https://gocv.io/">GoCV</a>(从较大的扫描件中查找并提取纸质文档),而不想永久性地在系统上安装OpenCV。</p> <p>这似乎是一个很好的示例用例,可以展示我喜欢使用的几个Nix命令,涵盖从快速交互式一次性开发环境到完全声明式、密封、可重现、可共享的开发环境。</p> <p>值得注意的是,你不需要使用NixOS就能运行这些命令!你可以在任何Linux系统(如Debian、Arch等)上<a href="/posts/2025-06-01-nixos-installation-declarative/#setup-nix">安装并使用Nix</a>,只要设置了Nix路径或使用了Flakes(参见<a href="#setup">设置</a>)。</p> <h2 id="debian-way">对比:Debian方式</h2> <p>在开始了解Nix之前,我将展示如何在Debian上运行GoCV。</p> <p>让我们创建一个使用GoCV函数(如<code>gocv.NewMat()</code>)的最小Go程序,只需验证我们能否编译这个程序:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#007020;font-weight:bold">package</span><span style="color:#bbb"> </span>main<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#007020;font-weight:bold">import</span><span style="color:#bbb"> </span><span style="color:#4070a0">&#34;gocv.io/x/gocv&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#007020;font-weight:bold">func</span><span style="color:#bbb"> </span><span style="color:#06287e">main</span>()<span style="color:#bbb"> </span>{<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>gocv.<span style="color:#06287e">NewMat</span>()<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span>}<span style="color:#bbb"> </span></span></span></code></pre></div><p>如果我们尝试在Debian系统上构建这个程序,会得到:</p> <pre tabindex="0"><code>debian % mkdir -p /tmp/minimal debian % cd /tmp/minimal debian % cat &gt; minimal.go &lt;&lt;&#39;EOT&#39; package main import &#34;gocv.io/x/gocv&#34; func main() { gocv.NewMat(); } EOT debian % go mod init minimal go: creating new go.mod: module minimal go: to add module requirements and sums: go mod tidy debian % go mod tidy go: finding module for package gocv.io/x/gocv go: downloading gocv.io/x/gocv v0.41.0 go: found gocv.io/x/gocv in gocv.io/x/gocv v0.41.0 debian % go build # gocv.io/x/gocv # [pkg-config --cflags -- opencv4] Package opencv4 was not found in the pkg-config search path. Perhaps you should add the directory containing `opencv4.pc&#39; to the PKG_CONFIG_PATH environment variable Package &#39;opencv4&#39;, required by &#39;virtual:world&#39;, not found </code></pre><p>在Debian上,我们可以按如下方式安装OpenCV:</p> <pre tabindex="0"><code>debian % sudo apt install libopencv-dev […] Summary: Upgrading: 7, Installing: 512, Removing: 0, Not Upgrading: 27 Download size: 367 MB Space needed: 1590 MB / 281 GB available Continue? [Y/n] </code></pre><p>对此提示回答“yes”会下载并安装超过500个包(需要几分钟)。</p> <p>现在构建可以工作了:</p> <pre tabindex="0"><code>debian % go build debian % file minimal minimal: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), […] </code></pre><p>……但我们的系统上多了500多个额外的包,这些包将需要永久更新,因此我想将这个一次性实验与我的常规系统隔离开来。</p> <p>我们可以使用Docker启动一个Debian容器并在其中工作,但根据任务的不同,这可能会很麻烦,恰恰因为它是一个独立的环境。对于这个示例,我需要指定一个卷挂载以使输入文件可供Docker容器使用,并且需要设置环境变量才能使Docker容器内的程序能够在主机上打开图形窗口……</p> <p>让我们看看如何使用Nix来帮助我们解决这个问题!</p> <h2 id="setup">设置:Nix-on-Debian(或Nix-on-Arch,或……)</h2> <p>NixOS用户可以跳过这一节,因为NixOS系统包含了一个可直接使用的Nix。</p> <p>在你自己电脑上尝试这些示例之前,需要完成以下三个步骤:</p> <ol> <li>安装Nix</li> <li>启用Flakes</li> <li>设置Nix路径</li> </ol> <h3 id="setup-install">步骤1:安装Nix</h3> <p>Debian、Arch、Fedora或其他Linux系统的用户首先需要安装Nix。幸运的是,Nix可用于许多流行的Linux发行版:</p> <ul> <li>Debian 提供了 <a href="https://packages.debian.org/trixie/nix-setup-systemd">nix-setup-systemd</a></li> <li>Arch Linux 提供了 <a href="https://archlinux.org/packages/extra/x86_64/nix/">nix</a> 并 <a href="https://wiki.archlinux.org/title/Nix">在 Nix Arch Wiki 页面上</a>提供了文档。实际操作中,我安装了该包并<a href="/posts/2025-06-01-nixos-installation-declarative/#setup-nix">配置了几个 <code>nixbld</code> 用户</a>。</li> <li>更一般地,还有适用于多个发行版的 Nix 构建包(rpm、deb、pacman):<a href="https://github.com/nix-community/nix-installers">https://github.com/nix-community/nix-installers</a></li> </ul> <h3 id="setup-flakes">步骤2:启用Flakes</h3> <p>Nix flakes 是<a href="https://determinate.systems/posts/flake-schemas/">“一种打包Nix工件的通用方式”</a>。</p> <p>示例3和示例4使用Nix flakes来锁定依赖项,因此我们需要<a href="/posts/2025-06-01-nixos-installation-declarative/#enabling-flakes">启用Nix flakes</a>。</p> <h3 id="setup-nix-path">步骤3:设置Nix路径</h3> <p>对于示例1和示例2,我们想使用Nix表达式 <code>import &lt;nixpkgs&gt;</code>。</p> <p>在NixOS上,这个表达式将跟随系统版本,也就是说如果你在NixOS 25.05安装中使用<code>import &lt;nixpkgs&gt;</code>,它将引用<a href="https://github.com/NixOS/nixpkgs/tree/nixos-25.05/">nixpkgs nixos-25.05版本</a>。</p> <p>在其他Linux系统上,你会看到类似这样的错误信息:</p> <pre tabindex="0"><code>debian-server % nix-shell -p pkg-config opencv error: file &#39;nixpkgs&#39; was not found in the Nix search path (add it using $NIX_PATH or -I) at «string»:1:25: 1| {...}@args: with import &lt;nixpkgs&gt; args; (pkgs.runCommandCC or pkgs.runCommand) &#34;shell&#34; { buildInputs = [ (pkg-config) (opencv) ]; } &#34;&#34; | ^ (use &#39;--show-trace&#39; to show detailed location information) </code></pre><p>我们需要通过设置<a href="https://nixos.org/guides/nix-pills/15-nix-search-paths.html">Nix搜索路径</a>来告诉Nix要使用哪个版本的<code>nixpkgs</code>:</p> <pre tabindex="0"><code>debian-server % export NIX_PATH=nixpkgs=channel:nixos-25.05 debian-server % nix-shell -p pkg-config opencv [nix-shell:/tmp/opencv]# </code></pre><p>好了!现在我们设置完毕。让我们进入第一个示例!</p> <h2 id="nix-shell">示例1:交互式一次性使用:nix-shell</h2> <p>Nix提供了一个中间地带:介于在系统上安装OpenCV(如上例中的<code>apt install</code>)和在单独的Docker容器中安装OpenCV之间:Nix可以在不永久安装的情况下提供OpenCV。</p> <p>我们可以运行<a href="https://manpages.debian.org/nix-shell.1"><code>nix-shell(1)</code></a> 来启动一个bash shell,其中指定的包可用。要成功构建使用GoCV的Go代码,我们需要有OpenCV可用:</p> <pr
查看原文
查看缓存全文

缓存时间: 2026/05/16 03:33

# 使用 Nix 搭建开发环境:四个快速示例 来源:https://michael.stapelberg.ch/posts/2025-07-27-dev-shells-with-nix-4-quick-examples/ ## 目录 - [对比:Debian 方式](#debian-way) - [环境准备:在 Debian 上安装 Nix(或在 Arch 上……)](#setup) - [第 1 步:安装 Nix](#setup-install) - [第 2 步:启用 Flakes](#setup-flakes) - [第 3 步:设置 Nix 路径](#setup-nix-path) - [示例 1:交互式一次性环境:nix-shell](#nix-shell) - [示例 2:nix-shell 配置文件:shell.nix](#shell.nix) - [示例 3:封闭式、固定版本的 devShell:Nix Flakes](#nix-flakes) - [示例 4:使 Flake 独立于系统](#system-indep-flake) - [小贴士:保持包长期可用](#profile-install) - [总结](#conclusion) 我想在自己的项目中使用 [GoCV](https://gocv.io/)(用来从大扫描件中查找并提取纸质文档),但又不想永久安装 OpenCV。这正好是一个好用例,可以展示一些我常用的 Nix 命令:从快速的交互式一次性开发环境,到完全声明式、封闭式、可重现、可共享的开发环境。值得注意的是,你不需要运行 NixOS 就能执行这些命令!你可以在任何 Linux 系统(如 Debian、Arch 等)上[安装并使用 Nix](https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/#setup-nix),只要设置了 Nix 路径或使用 Flakes(详见[环境准备](#setup))。 ## 对比:Debian 方式 在开始看 Nix 之前,我先展示一下如何在 Debian 上让 GoCV 跑起来。我们来创建一个极简的 Go 程序,它使用 GoCV 的某个函数(比如 `gocv.NewMat()`),只是为了验证我们可以编译这个程序: ```go package main import "gocv.io/x/gocv" func main() { gocv.NewMat() } ``` 如果在 Debian 系统上尝试构建,会得到: ``` debian % mkdir -p /tmp/minimal debian % cd /tmp/minimal debian % cat > minimal.go <<'EOT' package main import "gocv.io/x/gocv" func main() { gocv.NewMat(); } EOT debian % go mod init minimal go: creating new go.mod: module minimal go: to add module requirements and sums: go mod tidy debian % go mod tidy go: finding module for package gocv.io/x/gocv go: downloading gocv.io/x/gocv v0.41.0 go: found gocv.io/x/gocv in gocv.io/x/gocv v0.41.0 debian % go build # gocv.io/x/gocv # [pkg-config --cflags -- opencv4] Package opencv4 was not found in the pkg-config search path. Perhaps you should add the directory containing `opencv4.pc' to the PKG_CONFIG_PATH environment variable Package 'opencv4', required by 'virtual:world', not found ``` 在 Debian 上,我们可以这样安装 OpenCV: ``` debian % sudo apt install libopencv-dev [...] Summary: Upgrading: 7, Installing: 512, Removing: 0, Not Upgrading: 27 Download size: 367 MB Space needed: 1590 MB / 281 GB available Continue? [Y/n] ``` 回答 "yes" 后会下载并安装超过 500 个包(花费几分钟)。现在构建就成功了: ``` debian % go build debian % file minimal minimal: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), [...] ``` ……但是我们的系统上多了 500 多个额外包,以后需要一直更新它们,所以我希望将这个一次性实验与我的常规系统隔离开。我们可以使用 Docker 启动一个 Debian 容器并在其中工作,但根据任务的不同,这可能会很麻烦,因为它恰好是一个独立的环境。在这个例子中,我需要指定一个卷挂载来使我的输入文件对 Docker 容器可用,并且需要设置环境变量,以便 Docker 容器内的程序能在宿主机上打开图形窗口……让我们看看如何使用 Nix 来帮助我们吧! ## 环境准备:在 Debian 上安装 Nix(或在 Arch 上……) NixOS 用户可以跳过这一节,因为 NixOS 系统自带一个可直接使用的 Nix。在你自己计算机上尝试这些示例之前,需要完成以下三个步骤: 1. 安装 Nix 2. 启用 Flakes 3. 设置 Nix 路径 ### 第 1 步:安装 Nix Debian、Arch、Fedora 或其他 Linux 系统的用户需要先安装 Nix。幸运的是,Nix 在许多流行的 Linux 发行版中都可以获得: - Debian 提供了 `nix-setup-systemd`(https://packages.debian.org/trixie/nix-setup-systemd) - Arch Linux 提供了 `nix` 包(https://archlinux.org/packages/extra/x86_64/nix/),并在 [Nix Arch Wiki 页面](https://wiki.archlinux.org/title/Nix) 上提供了文档。实际使用中,我安装了该包并配置了几个 `nixbld` 用户(https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/#setup-nix)。 - 更一般地,许多发行版都有 Nix 构建包(rpm、deb、pacman):https://github.com/nix-community/nix-installers ### 第 2 步:启用 Flakes Nix Flakes 是“一种打包 Nix 工件的通用方式”(https://determinate.systems/posts/flake-schemas/)。示例 3 和 4 使用 Nix Flakes 来固定依赖,因此我们需要[启用 Nix Flakes](https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/#enabling-flakes)。 ### 第 3 步:设置 Nix 路径 对于示例 1 和 2,我们希望使用 Nix 表达式 `import <nixpkgs>`。在 NixOS 上,这个表达式会跟随系统版本,意思是如果你在 NixOS 25.05 安装上使用 `import <nixpkgs>`,那么它引用的将是 nixpkgs 版本 `nixos-25.05`(https://github.com/NixOS/nixpkgs/tree/nixos-25.05/)。在其他 Linux 系统上,你会看到这样的错误: ``` debian-server % nix-shell -p pkg-config opencv error: file 'nixpkgs' was not found in the Nix search path (add it using $NIX_PATH or -I) at «string»:1:25: 1| {...}@args: with import <nixpkgs> args; (pkgs.runCommandCC or pkgs.runCommand) "shell" { buildInputs = [ (pkg-config) (opencv) ]; } "" | ^ (use '--show-trace' to show detailed location information) ``` 我们需要通过设置 [Nix 搜索路径](https://nixos.org/guides/nix-pills/15-nix-search-paths.html) 来告诉 Nix 使用哪个版本的 `nixpkgs`: ``` debian-server % export NIX_PATH=nixpkgs=channel:nixos-25.05 debian-server % nix-shell -p pkg-config opencv [nix-shell:/tmp/opencv]# ``` 好的!现在我们已经准备好了。让我们进入第一个示例! ## 示例 1:交互式一次性环境:nix-shell Nix 提供了一种介于在系统上安装 OpenCV(如上例中的 `apt install`)和在单独的 Docker 容器中安装 OpenCV 之间的中间方案:Nix 可以使 OpenCV 可用,而无需永久安装它。我们可以运行 `nix-shell(1)`(https://manpages.debian.org/nix-shell.1)来启动一个 bash shell,其中指定的包是可用的。要成功构建使用 GoCV 的 Go 代码,我们需要 OpenCV 可用: ``` % nix-shell -p pkg-config opencv these 194 paths will be fetched (175.80 MiB download, 764.10 MiB unpacked): /nix/store/ig2nk0hsha9xaailhaj69yv677nv95q4-abseil-cpp-20210324.2 /nix/store/yw5xqn8lqinrifm9ij80nrmf0i6fdcbx-alsa-lib-1.2.13 [...] [nix-shell:/tmp/opencv]$ pkg-config --cflags opencv4 -I/nix/store/mh5b1dx2ifv4jkp9a8lgssxwhzxssb96-opencv-4.11.0/include/opencv4 ``` 你可能会问:是的,我们确实需要在这个 `nix-shell` 命令中显式指定 `pkg-config`,否则运行 `pkg-config` 会运行宿主版本(开发环境外),它找不到 `opencv4.pc`。 ## 示例 2:nix-shell 配置文件:shell.nix 一旦我们有了一组适用于项目的包(在我们的例子中,只是 `pkg-config` 和 `opencv`),我们可以创建一个 `shell.nix`(在任何目录中,但通常是在项目的根目录下),`nix-shell`(不带 `-p` 标志)会读取它: ```nix { pkgs ? import <nixpkgs> { }, }: pkgs.mkShell { packages = with pkgs; [ # Explicitly list pkg-config so that mkShell will arrange # for the PKG_CONFIG_PATH to find the .pc files. pkg-config opencv ]; } ``` ……然后,我们只需运行 `nix-shell`: ``` % nix-shell [nix-shell:/tmp/opencv]$ pkg-config --cflags opencv4 -I/nix/store/mh5b1dx2ifv4jkp9a8lgssxwhzxssb96-opencv-4.11.0/include/opencv4 ``` 如果你感兴趣,这里有一些关于包列表周围样板代码的文档指针: - 第 1 到 3 行声明了一个带参数集的函数——这是 `nix-shell` 能够调用你的 `shell.nix` 文件所必需的结构。 - `pkgs.mkShell`(https://nixos.org/manual/nixpkgs/stable/#sec-pkgs-mkShell)是用于 `nix-shell` 的一个便捷辅助函数。 - `with pkgs;` 部分允许我们写 `opencv` 而不是 `pkgs.opencv`。 顺便提一下:使用 [nixd 语言服务器](https://github.com/nix-community/nixd),带有 [LSP 支持](https://en.wikipedia.org/wiki/Language_Server_Protocol) 的编辑器可以显示包解析到的版本,指出拼写错误,或提供“跳转到定义”等功能。例如,在下面的截图中,我正在 Emacs 中编辑 `shell.nix`,并好奇 Nix 中 `opencv` 包的源代码是怎样的。通过将光标放在 `opencv` 上并按 `M-.`(`xref-find-definitions`),我跳转到了本地 Nix store 中的 `opencv/4.x.nix`: Emacs 显示 opencv/4.x.nix(跳转到 opencv 定义后) (https://michael.stapelberg.ch/posts/2025-07-27-dev-shells-with-nix-4-quick-examples/2025-07-19-emacs-nix-shell.jpg) ## 示例 3:封闭式、固定版本的 devShell:Nix Flakes 前面的示例使用了来自你的系统(或 Nix 路径)的 nixpkgs,这意味着当你升级系统时,不需要更改 `.nix` 文件——根据用例,我认为这种行为要么方便要么可怕。对于要求无论周围操作系统版本如何,`.nix` 文件都完全以相同方式构建的用例,我们可以使用 [Nix Flakes](https://wiki.nixos.org/wiki/Flakes) 以封闭式方式构建,依赖版本固定在 `flake.lock` 文件中。 `flake.nix` 包含与上面相同的 `mkShell` 表达式,但声明了其周围的结构:`mkShell` 表达式放入 `outputs.devShells.x86_64-linux.default` 属性中,而 `inputs` 属性包含 [Flake 引用](https://nix.dev/manual/nix/2.28/command-ref/new-cli/nix3-flake.html#flake-references),这些引用对该构建可用: ```nix { inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; outputs = { self, nixpkgs }: { devShells.x86_64-linux.default = let pkgs = nixpkgs.legacyPackages.x86_64-linux; in pkgs.mkShell { packages = with pkgs; [ # Explicitly list pkg-config so that mkShell will arrange # for the PKG_CONFIG_PATH to find the .pc files. pkg-config opencv ]; }; }; } ``` 顺便提一下:尽管名字如此,最佳实践是使用 `nixpkgs.legacyPackages`,它概念上提供单一的 `import nixpkgs` 结果(出于效率考虑,参见[此处讨论](https://discourse.nixos.org/t/using-nixpkgs-legacypackages-system-vs-import/17462/8))。 现在,我可以使用 `nix develop` 来获得一个带有 OpenCV 的 shell: ``` % nix develop michael@midna$ pkg-config --cflags opencv4 -I/nix/store/mh5b1dx2ifv4jkp9a8lgssxwhzxssb96-opencv-4.11.0/include/opencv4 ``` 第一次运行 `nix develop` 会创建一个 `flake.lock` 文件,所以之后运行 `nix develop` 会得到完全相同的环境。要更新到新版本,使用 `nix flake update`。 **提示:** 除了 shell,`nix develop --command=emacs` 也是一个有用的变体。 ## 示例 4:使 Flake 独立于系统 不幸的是,上面的 `flake.nix` 硬编码了 `x86_64-linux`,所以它将不能在例如 `aarch64-linux`(ARM)或 `x86_64-darwin`(Mac)上使用。默认情况下必须显式指定 `system` 是 Nix Flakes 长期以来的一个批评点。有多种解决方法。例如,我们可以使用 [numtide/flake-utils](https://github.com/numtide/flake-utils),并将我们的 `flake.nix` 重构为使用其 `eachDefaultSystem`(https://github.com/numtide/flake-utils?tab=readme-ov-file#eachdefaultsystem--system---attrs)便捷函数: ```nix { inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils, }: flake-utils.lib.eachDefaultSystem ( system: let pkgs = nixpkgs.legacyPackages.${system}; in { formatter = pkgs.nixfmt-tree; devShells.default = pkgs.mkShell { packages = with pkgs; [ # Explicitly list pkg-config so that mkShell will arrange # for the PKG_CONFIG_PATH to find the .pc files. pkg-config opencv ]; }; } ); } ``` 或者我们可以使用 [numtide/blueprint](https://github.com/numtide/blueprint),它是 flake-utils 的精神继承者。LucPerkins 的 dev-templates 实际上已经内联(https://github.com/the-nix-way/dev-templates/blob/main/go/flake.nix)了这一技术的一个版本。对于不属于 Nix 但邻近 Nix 的解决方案:[devenv](https://devenv.sh/) 是一个基于 Nix 的独立工具(不再使用 CppNix 实现,而是使用 [tvix](https://devenv.sh/blog/2024/10/22/devenv-is-switching-its-nix-implementation-to-tvix/)),但有自己的 `.nix` 文件。 ## 小贴士:保持包长期可用 如果你发现 `nix develop` 或类似命令在 `flake.lock` 未变化的情况下仍会获取包,你可以将 Flake 安装到你的 profile 中,从而将其声明为 Nix 的 [gcroot](https://nixos.org/guides/nix-pills/11-garbage-collector.html): ``` % nix profile install .#devShells.x86_64-linux.default ``` 但等等,这难道不是让我们回到了[Debian 方式](#debian-way) 相同的状态吗?不!虽然如果你将 flake 安装到 profile 中,OpenCV 将无限期可用,但仍然存在一层隔离:在你的系统上,OpenCV 并不可用,只有当你通过 `nix-shell` 或 `nix develop` 启动开发 shell 时才可用。 ## 总结 上面四个示例如何比较?这里有一个概览: | 示例 | 样板代码 | 固定版本? | 系统依赖? | |------|----------|------------|------------| | [示例 1](#nix-shell):`nix-shell -p ...` | 😊 | 否 | 否 | | [示例 2](#shell.nix):`shell.nix` | 🙂 | 否 | 否 | | [示例 3](#nix-flakes):`flake.nix` | 😲 | 是 | 是 | | [示例 4](#system-indep-flake):系统独立的 `flake.nix` | 🤨 | 是 | 否 | 对于个人一次性实验,我使用 `nix-shell`。一旦实验成功,我通常希望固定依赖,所以我使用 `flake.nix`。如果这个软件不仅仅是版本化的,还会发布(或者多人/多系统共同开发),我会花精力使其成为系统独立的 `flake.nix`。我希望将来编写系统独立的 flake 能变得更简单。尽管有些粗糙,但我很欣赏 Nix 给我的可重现性和控制力! 你喜欢这篇文章吗?订阅这个博客的 [RSS 订阅源](https://michael.stapelberg.ch/feed.xml) 以免错过任何新文章!我从 2005 年开始写博客,20 多年来一直在分享知识和经验!:)

相似文章

我喜欢的 NixOS 声明式安装方式

Michael Stapelberg

一份关于使用 nixos-anywhere 等工具通过网络声明式安装 NixOS 的指南,重点强调在版本控制下管理配置文件。

将我的 NAS 从 CoreOS/Flatcar Linux 迁移到 NixOS

Michael Stapelberg

Michael Stapelberg 详细介绍了他将一台 NAS 从 CoreOS/Flatcar Linux 迁移到 NixOS 的过程,涵盖了从 Docker 容器逐步过渡到原生 NixOS 模块的步骤,并附有实际示例。

NixOS 与密钥管理

Lobsters Hottest

教程介绍 NixOS 的密钥管理选项,比较 sops-nix、agenix 和 ragenix 工具,并提供使用 sops-nix 进行加密密钥管理的实际示例。