Nix

Nix 是一个声明式的包管理工具

包管理

nix-shell 会启动一个安装了指定包的 shell

通过:

1
nix-shell --run {cmd} -I  [--pure [--keep name]] -p {packages}

在安装了 {packages} 的 shell 中运行 {cmd} 后退出 shell

  • --pure 将不继承父级环境,同时指定 --keep name 将继承父级环境变量
  • --run 若换为 --command 则在运行后不退出 shell

或通过 shebang:

1
2
3
4
5
6
#!/usr/bin/env nix-shell
#! nix-shell -i python --pure
#! nix-shell -p python --packages python pythonPackages.numpy
#! nix-shell -I nixpkgs=channel:nixos-22.11

print("Hello, world!")

还可以通过:

1
nix-shell {path}

将根据 {path} 指向的 .nix 文件启动 shell;

不指定 {path} 则根据当前目录下的 shell.nix 文件启动 shell

一个 shell.nix

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let
nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-23.11"; # 指定源的版本
pkgs = import nixpkgs { config = {}; overlays = []; };
in
pkgs.mkShellNoCC {
packages = with pkgs; [
cowsay
lolcat
]; # 包
}

GREETING = "Hello, Nix!"; # 环境变量
shellHook = ''
echo $GREETING | cowsay | lolcat
''; # 初始化命令

https://wiki.nixos.org/ 提供了很多教程,用于编写 shell.nix


还有“最重要”的命令:nix-collect-garbage,用于拯救硬盘空间

名词解释

来自 https://nix.dev/manual/nix/2.18/glossary

  • derivation:构建任务
  • store: 运行时存储数据的地方,被存储其中的数据称为store object

Nix 语言

Nix 语言是一门用于包管理的 DSL

这部分记录了对 Nix 语言 2.18 版本的官方语言手册 的理解

  • 语言手册的首页给出了一张 Cheat Sheet,可以清晰了解这门语言

  • Nix 语言被用来构建 derivation,并运行对 derivation 进行求值以获得构建结果 来源

  • 函数都是 纯函数,除了:

    • 在字符串内对文件系统路径求值

    • 进行网络请求

      以上两种情况会将返回值暂存至本地,然后返回暂存结果的路径