第 9 章:Nix 包管理 - 强化
学习目标
- 掌握 shell.nix 编写
- 理解 Nix 表达式语言
- 学会创建开发环境
9.1 shell.nix 入门
什么是 shell.nix
shell.nix 是一个配置文件,描述开发环境需要哪些包。
第一个 shell.nix
创建 shell.nix:
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = [
pkgs.gcc
pkgs.gnumake
];
}
使用:
nix-shell
# 现在你在一个包含 gcc 和 make 的环境中
gcc --version
exit
9.2 Nix 表达式语言基础
基本类型
# 字符串
"hello"
''
多行字符串
第二行
''
# 数字
42
3.14
# 布尔值
true
false
# 列表
[ 1 2 3 ]
[ "a" "b" "c" ]
# 属性集(类似对象)
{ name = "XUPTArch"; version = "1.0"; }
函数
# 定义函数
double = x: x * 2
# 调用函数
double 21 # 结果:42
# 多参数函数
add = x: y: x + y
add 1 2 # 结果:3
let 绑定
let
name = "XUPTArch";
version = "1.0";
in
"${name}-${version}"
9.3 实用的 shell.nix 示例
C 项目开发环境
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = with pkgs; [
gcc
gdb
gnumake
valgrind
];
shellHook = ''
echo "Welcome to C development environment!"
echo "GCC version: $(gcc --version | head -1)"
'';
}
Python 项目环境
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = with pkgs; [
python3
python3Packages.pip
python3Packages.virtualenv
];
}
9.4 环境变量
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = [ pkgs.gcc ];
MY_VAR = "hello";
PROJECT_ROOT = builtins.toString ./.;
shellHook = ''
export PATH=$PWD/bin:$PATH
echo "Project root: $PROJECT_ROOT"
'';
}
实践练习
创建一个 C 项目的开发环境:
- 创建
shell.nix,包含 gcc、make、gdb - 添加 shellHook 显示欢迎信息
- 设置环境变量
PROJECT_NAME - 进入环境并编译一个简单的 C 程序