在 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
吗?