Nix Develop 总结
986 字
5 分钟
Nix Develop 总结
Nix Develop 总结
1. 什么是 nix develop?
nix develop是 Nix(尤其是 Flakes)提供的项目级临时开发环境命令。- 核心基于
pkgs.mkShell(stdenv.mkDerivation的包装器)。 - 它不构建可执行文件,而是动态构造一个干净的 Bash(或指定 Shell)环境,退出后环境自动消失。
- 配合
flake.nix使用,实现声明式、可重现的开发环境。
一句话本质:Nix 为你的项目动态“组装”一个传统开发环境,让语言包管理器(npm/pnpm/pip/cargo 等)能愉快工作,同时保持 Nix 的纯净性和可重现性。
2. 核心工作原理
-
声明依赖(
buildInputs/nativeBuildInputs):- Nix 会把指定的包从
/nix/store拉出来(包括工具和系统库)。
- Nix 会把指定的包从
-
自动注入环境变量(最关键):
PATH:添加二进制工具。PKG_CONFIG_PATH、CPATH、LIBRARY_PATH、LD_LIBRARY_PATH等:让编译器找到头文件和库。- 各语言特定变量。
-
Setup Hooks:
- Nixpkgs 中的包自带钩子脚本,进入 Shell 时自动运行,完成环境配置。
-
shellHook(可选):
- 用户自定义脚本,进入环境时自动执行(如激活 venv、提示安装依赖)。
结果:传统工具“以为”自己在普通 Linux 的 FHS 环境中,从而能直接使用。
3. 与全局安装的对比
| 维度 | nix develop (推荐开发) | 全局安装 (systemPackages) |
|---|---|---|
| 范围 | 项目级、临时 | 系统级、永久 |
| 隔离性 | 极强 | 无 |
| 可重现性 | 极高(flake.nix) | 较低 |
| 版本共存 | 容易(不同项目不同版本) | 困难 |
| 系统库提供 | 自动(pkg-config、openssl 等) | 需要手动补充 |
| 污染 | 几乎无 | 会污染全局 |
| 适用场景 | 项目开发 | 通用 CLI 工具 |
最佳实践:全局装少量通用工具 + 项目用 nix develop。
4. 对语言包管理器的支持
能直接使用(项目本地依赖):
- Node.js:
npm install、pnpm install、yarn→./node_modules持久保存。 - Python:
pip install(推荐在 venv 中)→ 虚拟环境持久保存。 - Rust:
cargo build、cargo install(本地)。 - Go:
go mod tidy等,几乎零配置。 - PHP (composer)、Ruby (bundler) 等也基本可用。
全局安装(如 -g):仍需配置用户目录 prefix,否则会失败(只读 store)。
下次进入是否需要重新下载?
- 不需要。依赖安装在项目目录(
node_modules、venv、pnpm store 等),持久有效。 - 仅在删除目录、更新 lock 文件、切换工具版本时才需重新安装。
5. 如何解决系统库 / FHS 问题
- 传统问题:
openssl not found、zlib.h missing等。 - Nix 方案:在
buildInputs加入pkg-config、openssl、openssl.dev、zlib、libiconv等,自动通过环境变量解决。 - 硬编码 FHS 二进制:
- 不算特别多,主要出现在预编译闭源工具、旧软件、部分 wheel。
- 解决方案:
nix-ld(推荐)、patchelf、buildFHSUserEnv、envfs。
6. 基础 flake.nix 示例
{ description = "开发环境";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }: let system = "x86_64-linux"; # 改成你的系统 pkgs = nixpkgs.legacyPackages.${system}; in { devShells.${system}.default = pkgs.mkShell { buildInputs = with pkgs; [ nodejs_22 pnpm python312 cargo rustc pkg-config openssl openssl.dev zlib # ... 按需添加 ];
shellHook = '' echo "🚀 环境已加载" # 可添加自动激活 venv 等 ''; }; };}使用:
nix develop # 进入# 或 nix develop .#defaultexit # 退出7. 进阶增强
- direnv:进入目录自动
nix develop(最丝滑)。 - AI/ML 项目:特别适合(CUDA 版本精确匹配、复杂 Python 依赖)。
- 混合使用:全局装常用工具 + 项目
nix develop微调。 - 生产部署:仍推荐用
buildNpmPackage、buildRustPackage等纯 Nix 打包。
8. 优点总结
- 可重现性:别人拉代码
nix develop即可。 - 干净隔离:不污染系统,多版本共存。
- 解决痛点:自动处理系统库,让原生包管理器好用。
- 灵活:开发时混合使用,部署时纯 Nix。
- 生态趋势:越来越多仓库自带
flake.nix,兼容性持续改善。
9. 注意事项 / 局限
- 第一次进入可能稍慢(构建环境)。
- 极少数顽固二进制仍需 nix-ld 或 FHS 环境。
- 学习曲线:需要适应 flake 写法。
- 全局
-g安装依然不友好(需配置 prefix)。
核心理念:
Nix 不禁止用 pip/npm/cargo,而是提供更好的底层环境,让混合使用时体验更好。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
Nix Develop 总结
https://zno233.github.io/posts/nix-develop-全面总结/