在 Nix 生态中配置开发环境和管理软件更新是非常强大且灵活的。下面我将从两个方面为你详细介绍:
一、Nix 开发环境的配置方法
Nix 提供了多种方式来配置开发环境,常见的方式包括:
1. 使用 shell.nix 或 flake.nix 配置开发环境
方法一:传统 shell.nix(非 Flakes)
创建一个 shell.nix 文件来定义你的开发环境依赖:
# shell.nix
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  buildInputs = [
    pkgs.python310
    pkgs.python310Packages.numpy
    pkgs.python310Packages.pip
    pkgs.nodejs-18_x
    pkgs.rustc
    pkgs.cargo
    pkgs.git
  ];
  # 可选:设置环境变量
  shellHook = ''
    echo "开发环境已加载"
    export ENV=development
  '';
}
进入开发环境:
nix-shell
或者使用简写:
nix shell
注意:nix shell 是 Nix 2.4+ 的新命令,行为略有不同。
方法二:使用 Flakes(推荐方式)
启用 Flakes(需在 /etc/nix/nix.conf 中添加):
experimental-features = nix-command flakes
创建 flake.nix:
# flake.nix
{
  description = "我的开发环境";
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  outputs = { self, nixpkgs }: {
    devShells.x86_64-linux.default = nixpkgs.legacyPackages.x86_64-linux.mkShell {
      buildInputs = [
        nixpkgs.legacyPackages.x86_64-linux.python310
        nixpkgs.legacyPackages.x86_64-linux.python310Packages.flask
        nixpkgs.legacyPackages.x86_64-linux.nodejs-18_x
        nixpkgs.legacyPackages.x86_64-linux.rustc
        nixpkgs.legacyPackages.x86_64-linux.cargo
      ];
      shellHook = ''
        echo "欢迎进入开发环境"
      '';
    };
  };
}
进入开发环境:
nix develop
nix develop 等价于旧的 nix-shell,但基于 Flakes。
2. 使用 devShells 定义多个环境(如测试、生产)
你可以在 flake.nix 中定义多个 shell:
devShells.x86_64-linux.dev = mkShell { ... };
devShells.x86_64-linux.test = mkShell { ... };
使用:
nix develop .#test
3. 使用 direnv + nix-direnv 自动加载环境
安装 nix-direnv 后,在项目中添加 .envrc:
use nix
这样进入目录时会自动加载 shell.nix 或 flake.nix。
二、如何更新 Nix 中的软件?
Nix 本身不“更新”已安装的包,而是通过更新 nixpkgs 源来获取新版本的软件。
1. 更新 nix-channel(传统方式)
如果你使用 nix-env 和 channel:
# 更新 channel
nix-channel --update
# 升级所有用户软件
nix-env -u '*'
⚠️ 不推荐使用 nix-env,容易造成“垃圾”和依赖混乱。
2. 更新 nixpkgs 引用(Flakes 推荐方式)
如果你使用 Flakes,更新方式如下:
查看当前输入:
nix flake show
更新所有输入:
nix flake update
这会更新 flake.lock 文件,拉取最新的 nixpkgs 等依赖。
更新特定输入:
nix flake update nixpkgs
指定特定版本或分支:
nix flake lock --update-input nixpkgs
或指定版本:
nix flake lock --override-input nixpkgs github:NixOS/nixpkgs/nixos-23.11
3. 使用稳定版 vs 不稳定版
- 稳定版:
github:NixOS/nixpkgs/nixos-23.11 
- 不稳定版(滚动更新):
github:NixOS/nixpkgs/nixos-unstable 
推荐开发使用 unstable 获取最新软件,生产使用稳定版。
4. 如何知道某个包是否有新版本?
nix search nixpkgs python3
或访问 https://search.nixos.org
也可以查看 nixpkgs 的 GitHub 仓库提交历史。
三、最佳实践建议
| 建议 | 说明 | 
| ✅ 使用 Flakes | 更可复现、声明式、版本锁定 | 
✅ 避免 nix-env | 容易导致环境混乱 | 
✅ 使用 nix develop | 统一开发环境入口 | 
✅ 提交 flake.lock | 确保团队环境一致 | 
✅ 结合 direnv | 提升开发体验 | 
总结
- 配置开发环境:使用 
shell.nix 或 flake.nix 定义 devShells 
- 进入环境:
nix develop(Flakes)或 nix-shell 
- 更新软件:通过 
nix flake update 更新 nixpkgs 源 
- 推荐方式:Flakes + Git 管理 + 
direnv 
如果你提供具体项目类型(如 Python、Node.js、Rust),我可以给出更具体的 flake.nix 示例。
需要我帮你写一个 Python 开发环境的 flake.nix 吗?