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选择提交。