Nix Develop 总结

986 字
5 分钟
Nix Develop 总结

Nix Develop 总结

1. 什么是 nix develop#

  • nix develop 是 Nix(尤其是 Flakes)提供的项目级临时开发环境命令。
  • 核心基于 pkgs.mkShellstdenv.mkDerivation 的包装器)。
  • 不构建可执行文件,而是动态构造一个干净的 Bash(或指定 Shell)环境,退出后环境自动消失。
  • 配合 flake.nix 使用,实现声明式、可重现的开发环境。

一句话本质:Nix 为你的项目动态“组装”一个传统开发环境,让语言包管理器(npm/pnpm/pip/cargo 等)能愉快工作,同时保持 Nix 的纯净性和可重现性。

2. 核心工作原理#

  1. 声明依赖buildInputs / nativeBuildInputs):

    • Nix 会把指定的包从 /nix/store 拉出来(包括工具和系统库)。
  2. 自动注入环境变量(最关键):

    • PATH:添加二进制工具。
    • PKG_CONFIG_PATHCPATHLIBRARY_PATHLD_LIBRARY_PATH 等:让编译器找到头文件和库。
    • 各语言特定变量。
  3. Setup Hooks

    • Nixpkgs 中的包自带钩子脚本,进入 Shell 时自动运行,完成环境配置。
  4. shellHook(可选):

    • 用户自定义脚本,进入环境时自动执行(如激活 venv、提示安装依赖)。

结果:传统工具“以为”自己在普通 Linux 的 FHS 环境中,从而能直接使用。

3. 与全局安装的对比#

维度nix develop (推荐开发)全局安装 (systemPackages)
范围项目级、临时系统级、永久
隔离性极强
可重现性极高(flake.nix)较低
版本共存容易(不同项目不同版本)困难
系统库提供自动(pkg-config、openssl 等)需要手动补充
污染几乎无会污染全局
适用场景项目开发通用 CLI 工具

最佳实践:全局装少量通用工具 + 项目用 nix develop

4. 对语言包管理器的支持#

能直接使用(项目本地依赖):

  • Node.jsnpm installpnpm installyarn./node_modules 持久保存。
  • Pythonpip install(推荐在 venv 中)→ 虚拟环境持久保存。
  • Rustcargo buildcargo install(本地)。
  • Gogo mod tidy 等,几乎零配置。
  • PHP (composer)、Ruby (bundler) 等也基本可用。

全局安装(如 -g:仍需配置用户目录 prefix,否则会失败(只读 store)。

下次进入是否需要重新下载?

  • 不需要。依赖安装在项目目录(node_modulesvenv、pnpm store 等),持久有效。
  • 仅在删除目录、更新 lock 文件、切换工具版本时才需重新安装。

5. 如何解决系统库 / FHS 问题#

  • 传统问题:openssl not foundzlib.h missing 等。
  • Nix 方案:在 buildInputs 加入 pkg-configopensslopenssl.devzliblibiconv 等,自动通过环境变量解决。
  • 硬编码 FHS 二进制
    • 不算特别多,主要出现在预编译闭源工具、旧软件、部分 wheel。
    • 解决方案:nix-ld(推荐)、patchelfbuildFHSUserEnvenvfs

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 等
'';
};
};
}

使用:

Terminal window
nix develop # 进入
# 或 nix develop .#default
exit # 退出

7. 进阶增强#

  • direnv:进入目录自动 nix develop(最丝滑)。
  • AI/ML 项目:特别适合(CUDA 版本精确匹配、复杂 Python 依赖)。
  • 混合使用:全局装常用工具 + 项目 nix develop 微调。
  • 生产部署:仍推荐用 buildNpmPackagebuildRustPackage 等纯 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-全面总结/
作者
一杯清风不加糖
发布于
2026-05-21
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
一杯清风不加糖
天上地下,惟我独尊,舍我之外,皆为外物.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
14
分类
7
标签
25
总字数
18,773
运行时长
0
最后活动
0 天前

文章目录