学习目标

  • 掌握 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 项目的开发环境:

  1. 创建 shell.nix,包含 gcc、make、gdb
  2. 添加 shellHook 显示欢迎信息
  3. 设置环境变量 PROJECT_NAME
  4. 进入环境并编译一个简单的 C 程序

下一步

第 10 章:Nix 包管理 - 进阶

更新时间: