<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nix on PlumePHP</title><link>https://plumephp.com/tags/nix/</link><description>Recent content in Nix on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 28 Sep 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/nix/index.xml" rel="self" type="application/rss+xml"/><item><title>Nix Flake 模板实战：从零搭建多语言项目脚手架</title><link>https://plumephp.com/nix-flake-templates/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-flake-templates/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;每个新项目都要「从零配一遍环境」——语言版本、工具链、CI 配置，换个机器又得重来。&lt;strong&gt;Nix Flake 模板&lt;/strong&gt;把这些固化成一个可复用的 &lt;code&gt;flake init&lt;/code&gt; 模板：一条命令初始化出带 devShell、构建、检查、CI 的项目骨架。本文讲清模板体系、常用模板、以及如何自建团队的标准化模板。&lt;/p&gt;</description></item><item><title>交叉编译与 overlay：异构构建全攻略</title><link>https://plumephp.com/nix-cross-compilation-overlay/</link><pubDate>Sat, 26 Sep 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/nix-cross-compilation-overlay/</guid><description>&lt;h2 id="1-交叉编译为什么难nix-为什么能做好"&gt;1. 交叉编译为什么难，Nix 为什么能做好&lt;/h2&gt;
&lt;p&gt;传统交叉编译的痛点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工具链混乱：&lt;code&gt;arm-linux-gnueabihf-gcc&lt;/code&gt;、&lt;code&gt;aarch64-linux-gnu-gcc&lt;/code&gt; 各种前缀，依赖库也要为 target 编译&lt;/li&gt;
&lt;li&gt;依赖地狱：一个库的交叉编译依赖链很长，手工管理必然出错&lt;/li&gt;
&lt;li&gt;环境漂移：编译机的 glibc/内核头文件影响产物&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nix 的两大机制让它成为交叉编译的最优解：&lt;/p&gt;</description></item><item><title>可复现开发环境：devenv.sh、devShells 与 direnv</title><link>https://plumephp.com/nix-devenv-reproducible-dev/</link><pubDate>Sat, 26 Sep 2026 13:00:00 +0800</pubDate><guid>https://plumephp.com/nix-devenv-reproducible-dev/</guid><description>&lt;h2 id="1-开发环境的最后一公里难题"&gt;1. 开发环境的「最后一公里」难题&lt;/h2&gt;
&lt;p&gt;包可以复现、构建可以缓存，但&lt;strong&gt;开发者的 shell 环境&lt;/strong&gt;仍然充满非确定性：&lt;code&gt;node --version&lt;/code&gt; 是 18 还是 20？&lt;code&gt;PYTHONPATH&lt;/code&gt; 指向哪？&lt;code&gt;pre-commit&lt;/code&gt; 装的钩子版本对吗？换台机器、换个同事，环境就漂移。&lt;/p&gt;</description></item><item><title>Nix 构建与 CI：GitHub Actions 集成与 Cachix 缓存</title><link>https://plumephp.com/nix-ci-cachix/</link><pubDate>Sat, 26 Sep 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/nix-ci-cachix/</guid><description>&lt;h2 id="1-为什么-ci-里用-nix"&gt;1. 为什么 CI 里用 Nix？&lt;/h2&gt;
&lt;p&gt;传统 CI（apt/yarn/pip 安装依赖）的问题：&lt;strong&gt;每次跑都是重新下载、版本漂移、缓存不可控&lt;/strong&gt;。Nix 改变这一切的核心在于：&lt;/p&gt;</description></item><item><title>Flakes 最佳实践：企业级布局与模块化拆分</title><link>https://plumephp.com/nix-flakes-best-practices/</link><pubDate>Sat, 26 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-flakes-best-practices/</guid><description>&lt;h2 id="1-从能用到可维护"&gt;1. 从「能用」到「可维护」&lt;/h2&gt;
&lt;p&gt;https://plumephp.com/nix-flakes/ 讲解了 flake.nix 的基本结构与命令；本文解决的是更高一层的问题：&lt;strong&gt;当 flake 从一个人练习变成多人、多项目、跨团队的共享基础设施时，怎么组织才不会烂掉？&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Nix 语言深度：函数、惰性求值与模块化抽象</title><link>https://plumephp.com/nix-language-deep-dive/</link><pubDate>Sat, 26 Sep 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/nix-language-deep-dive/</guid><description>&lt;h2 id="1-为什么还要深挖语言本身"&gt;1. 为什么还要深挖语言本身？&lt;/h2&gt;
&lt;p&gt;Nix 不是「一门附属于包管理器的配置格式」，而是一门图灵完备的&lt;strong&gt;纯函数式、惰性求值&lt;/strong&gt;语言。https://plumephp.com/nix-language-basics/ 覆盖了语法入门；但当你开始编写复杂的 &lt;code&gt;overlay&lt;/code&gt;、&lt;code&gt;lib.fix&lt;/code&gt;、&lt;code&gt;override&lt;/code&gt; 时，很快会撞上几个令人困惑的现象：&lt;/p&gt;</description></item><item><title>Home Manager 用户级配置</title><link>https://plumephp.com/nix-home-manager/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-home-manager/</guid><description>&lt;h2 id="1-home-manager-的定位"&gt;1. Home Manager 的定位&lt;/h2&gt;
&lt;p&gt;Home Manager 是 Nix 生态系统中管理用户级配置的利器。它填补了 NixOS 系统级配置管理的一个空白——普通用户的个人环境配置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决的问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dotfiles 管理&lt;/strong&gt;：&lt;code&gt;~/.bashrc&lt;/code&gt;、&lt;code&gt;~/.vimrc&lt;/code&gt;、&lt;code&gt;~/.config/&lt;/code&gt; 等配置文件散落各处，换机器或重装时需要数小时重新配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户级包管理&lt;/strong&gt;：不需要 root 权限就能安装和管理个人工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨发行版一致&lt;/strong&gt;：无论在使用 Ubuntu、macOS、Arch 还是 NixOS，个人环境可以完全一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;版本控制&lt;/strong&gt;：所有配置以代码形式存储，变更可追溯、可回滚&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Home Manager 与 NixOS 的关系是互补的：NixOS 管理整个系统（系统服务、网络、硬件），Home Manager 管理用户个人环境（Shell 配置、编辑器设置、用户级包）。在 NixOS 上两者可以协同工作，在非 NixOS（如 Ubuntu 或 macOS）上 Home Manager 可以独立运行。&lt;/p&gt;</description></item><item><title>Nix Flakes 现代包管理</title><link>https://plumephp.com/nix-flakes/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-flakes/</guid><description>&lt;h2 id="1-为什么需要-flakes"&gt;1. 为什么需要 Flakes？&lt;/h2&gt;
&lt;p&gt;在 Flakes 引入之前，Nix 面临几个长期困扰：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不可追踪的依赖&lt;/strong&gt;：&lt;code&gt;import &amp;lt;nixpkgs&amp;gt;&lt;/code&gt; 依赖于系统上配置的 nixpkgs 通道，不同机器上的通道版本可能不同&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;版本锁定缺失&lt;/strong&gt;：没有内置机制锁定外部依赖的确切版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令不统一&lt;/strong&gt;：&lt;code&gt;nix-build&lt;/code&gt;、&lt;code&gt;nix-shell&lt;/code&gt;、&lt;code&gt;nix-env&lt;/code&gt; 等命令各有一套参数和行为&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可发现性差&lt;/strong&gt;：社区共享的 Nix 表达方式（如 GitHub 上的表达式）难以便捷引用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Flakes 通过以下设计解决了这些问题：&lt;/p&gt;</description></item><item><title>Nix Shell 开发环境</title><link>https://plumephp.com/nix-shell-development/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-shell-development/</guid><description>&lt;h2 id="1-可复现开发环境的痛点"&gt;1. 可复现开发环境的痛点&lt;/h2&gt;
&lt;p&gt;传统开发环境管理面临诸多挑战：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;在我机器上能跑&amp;rdquo;&lt;/strong&gt;：不同开发者安装的开发工具版本不同，导致构建失败或行为不一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖版本冲突&lt;/strong&gt;：项目需要 &lt;a href="https://plumephp.com/posts/python/"&gt;Python&lt;/a&gt; 3.9，但系统默认是 Python 3.11，全局安装会破坏其他项目&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新员工入职&lt;/strong&gt;：需要数天安装和配置开发工具链，文档往往过时&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://plumephp.com/posts/devops/"&gt;CI/CD&lt;/a&gt; 漂移&lt;/strong&gt;：本地构建通过但 CI 失败，因为 CI 环境用了不同的工具版本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nix Shell 通过声明式配置解决了这些问题：开发环境配置以代码形式存储在项目仓库中，新成员只需运行一个命令即可获得完全一致的开发环境。&lt;/p&gt;</description></item><item><title>Nix 与 NixOS 专题：声明式系统管理的函数式革命</title><link>https://plumephp.com/posts/nix/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/posts/nix/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Nix 解决了软件工程中最令人头痛的问题之一——「在我的机器上能跑」。通过纯函数式的包管理（相同的输入永远产生相同的输出）和声明式系统配置，Nix 让开发环境、CI 环境和生产环境实现彻底的可复现。无论是个人开发机器的 dotfiles 管理，还是千节点服务器的统一部署，Nix 的「配置即代码」哲学都提供了优雅解。&lt;/p&gt;</description></item><item><title>Nix 包管理实战</title><link>https://plumephp.com/nix-package-management/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-package-management/</guid><description>&lt;h2 id="1-nix-包管理的核心理念"&gt;1. Nix 包管理的核心理念&lt;/h2&gt;
&lt;p&gt;传统的包管理器（如 apt、yum、pacman）在全局文件系统上安装软件包，这种方式面临几个根本性问题：依赖冲突、难以回滚、构建不可复现。Nix 包管理器通过以下创新解决了这些问题：&lt;/p&gt;</description></item><item><title>Nix 构建 Docker 镜像</title><link>https://plumephp.com/nix-nix-docker/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-nix-docker/</guid><description>&lt;h2 id="1-传统-dockerfile-的痛点"&gt;1. 传统 &lt;a href="https://plumephp.com/posts/docker/"&gt;Dockerfile&lt;/a&gt; 的痛点&lt;/h2&gt;
&lt;p&gt;Docker 容器化彻底改变了软件部署方式，但 Dockerfile 本身存在几个根本性问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不稳定的构建&lt;/strong&gt;：&lt;code&gt;apt-get update &amp;amp;&amp;amp; apt-get install&lt;/code&gt; 的结果取决于构建时远程仓库的状态，今天构建和明天构建可能产生不同的镜像&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;层缓存陷阱&lt;/strong&gt;：不当的指令排序导致缓存失效，Dockerfile 越写越长、越来越复杂&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图像膨胀&lt;/strong&gt;：&lt;code&gt;ubuntu:22.04&lt;/code&gt; 基础镜像已有 77MB，加上 &lt;a href="https://plumephp.com/posts/python/"&gt;Python&lt;/a&gt;、&lt;a href="https://plumephp.com/posts/nodejs/"&gt;Node&lt;/a&gt; 等运行时，最终镜像动辄数百 MB，而实际业务代码可能只有几十 MB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重复依赖&lt;/strong&gt;：10 个微服务都用了不同版本的 &lt;code&gt;node:18-alpine&lt;/code&gt;，每个镜像独立重复存储依赖&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全问题&lt;/strong&gt;：&lt;code&gt;apt-get install&lt;/code&gt; 引入的依赖包数量不可控，漏洞扫描发现大量并不需要的库&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nix 通过纯函数式构建和精确依赖追踪，从根本上解决了这些问题。&lt;/p&gt;</description></item><item><title>Nix 语言基础</title><link>https://plumephp.com/nix-language-basics/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-language-basics/</guid><description>&lt;h2 id="1-nix-语言简介"&gt;1. Nix 语言简介&lt;/h2&gt;
&lt;p&gt;Nix 表达式语言（Nix Expression Language）是一门专门为软件包管理和系统配置设计的纯函数式编程语言。它的核心设计目标是实现&lt;strong&gt;可复现性&lt;/strong&gt;（Reproducibility）和&lt;strong&gt;声明式配置&lt;/strong&gt;（Declarative Configuration）——给定相同的 Nix 表达式，无论在何时何地求值，都会得到完全相同的结果。&lt;/p&gt;</description></item><item><title>NixOS 远程部署工具</title><link>https://plumephp.com/nix-deployment-tools/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-deployment-tools/</guid><description>&lt;h2 id="1-为什么需要专门的部署工具"&gt;1. 为什么需要专门的部署工具？&lt;/h2&gt;
&lt;p&gt;NixOS 的系统重建命令 &lt;code&gt;nixos-rebuild switch&lt;/code&gt; 设计初衷是在本地运行。但在以下场景中，需要在远程机器上执行配置更新：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务器集群管理&lt;/strong&gt;：几十台生产服务器需要统一更新 Nginx 配置或安全补丁&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;边缘节点部署&lt;/strong&gt;：树莓派集群、IoT 设备需要在不物理接触的情况下更新&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://plumephp.com/posts/devops/"&gt;CI/CD&lt;/a&gt; 集成&lt;/strong&gt;：&lt;a href="https://plumephp.com/posts/github-actions/"&gt;Git&lt;/a&gt; 提交后自动部署到测试环境和生产环境&lt;/li&gt;
&lt;li&gt;** secrets 管理**：配置中包含 API 密钥、证书等敏感数据，需要安全地传递到目标主机&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;手动 SSH 到每台服务器运行 &lt;code&gt;nixos-rebuild switch&lt;/code&gt; 显然不可扩展。Nix 社区开发了多种专用工具来解决这些需求。&lt;/p&gt;</description></item></channel></rss>