Nix教程①:简单的开始

Ad hoc shell 环境🔗

使用nix-shell和-p(--packages)来创建一个Nix shell,在Nix shell中就可以使用这些包。输入exit退出这个shell。
如果需要直接运行,可以加--run再加入命令,如:

nix-shell -p python3 --run "python3 --version"

这行命令会创建一个Nix shell,安装python3,然后运行python3 --version命令。

💡 提示

  • 可以在NixOS Search查找程序包。
  • Nix shell里也可以嵌套使用Nix shell。

可重现环境🔗

直接创建Nix shell可能会使环境不可重现,因为包的版本可能随时间变化。使用以下命令创建一个可重复实现的环境:

nix-shell -p git --run "git --version" --pure -I nixpkgs=https://github.com/NixOS/nixpkgs/tarball/2a601aafdc5605a5133a2ca506a34a3a73377247

-I参数指定了Nixpkgs的源,这里选的是github上一个特定的版本。--pure参数忽略了系统的大多数环境变量,一般在需要隔离时使用。

可重现脚本🔗

假设我们要运行以下脚本:

#! /bin/bash

curl https://github.com/NixOS/nixpkgs/releases.atom | xml2json | jq .

这个脚本获取URL的XML将其转换为JSON,并更改格式以提高可读性。
这个脚本需要curl、xml2json和jq三个包,若系统中没有这些包,脚本会失败。
为了使脚本可重现,我们使用以下脚本:

#!/usr/bin/env nix-shell
#! nix-shell -i bash --pure
#! nix-shell -p bash cacert curl jq python3Packages.xmljson
#! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/2a601aafdc5605a5133a2ca506a34a3a73377247.tar.gz

curl https://github.com/NixOS/nixpkgs/releases.atom | xml2json | jq .

这个脚本使用了nix-shell的shebang,-i指定了bash为其余部分的解释器。-p参数指定了需要的包其中xml2json由python3Packages.xmljson提供,cacert使SSL身份验证正常工作。-I参数指定了Nixpkgs仓库特定的提交,这一步保证了包的版本相同。

ℹ️ 注意

第一行是标准的shebang,指定了脚本的解释器。第二行到第四行是nix-shell脚本的shebang。

声明式shell环境🔗

Ad hoc shell环境在一次性使用时比较方便,如果想要更多的自定义空间,从shell.nix文件创建一个shell环境是更好的选择。

💡 提示

有点像docker里的Dockerfile。

创建一个shell.nix文件,内容如下:

let
  nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.05";
  pkgs = import nixpkgs { config = {}; overlays = []; };
in

pkgs.mkShellNoCC {
  packages = with pkgs; [
    cowsay
    lolcat
  ];

  GREETING = "Hello, Nix!";
  shellHook = ''
    echo $GREETING | cowsay | lolcat
  '';
}

在shell.nix文件同一个目录下运行nix-shell,会根据shell.nix文件创建一个shell环境,这里包含cowsay和lolcat两个包。
具体的Nix语言细节将在之后的章节讲解。

固定Nixpkgs🔗

Nix实例中有类似这样的内容:

{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/06278c77b5d162e62df170fec307e83f1812d94b.tar.gz") {}
}:

这里直接从Github获取相应的提交,我们可以在NixOS Status选择提交。