我使用NixOS,Nix 版本 1.10。nix-env,Nix包管理器的安装命令,创建新一代每次安装软件包时这样,不同的包配置存储在不同的代中,您可以在它们之间切换以回滚到系统的先前状态,即从现在起安装了不同的包。
假设我安装了包emacs,它创建了新一代:
$ nix-env --list-generations\n1 2015-09-18 14:32:51 \n2 2015-09-19 15:41:58 (current)\nRun Code Online (Sandbox Code Playgroud)\n\n第 1 代不包含emacs,第 2 代包含 。如果我切换到第 1 代并删除第 2 代,那就意味着我输了emacs:
$ nix-env --switch-generation 1\nswitching from generation 2 to 1\n$ nix-env --delete-generations 2\nremoving generation 2\nRun Code Online (Sandbox Code Playgroud)\n\n运行操作的信息--delete-generations太少,添加--verbose或未--dry-run指定删除的包列表。甚至-vvvvv没有帮助。
$ nix-env --dry-run --delete-generations 14\n(dry run; not doing anything)\nwould remove generation 14\n$ nix-env --verbose --dry-run --delete-generations 14\n(dry run; not doing anything)\nevaluating file \xe2\x80\x98/nix/store/13lmbyk148z95sp96gh0vr2b867ypl8g-nix-1.10/share/nix/corepkgs/derivation.nix\xe2\x80\x99\nwould remove generation 14\nRun Code Online (Sandbox Code Playgroud)\n\n但我怎么知道我输了emacs呢?是否有任何命令或非常简单的脚本来查看如果我永久删除一代我会丢失的软件包列表?或者有没有办法查看两代之间的差异?我力求最简单的惯用解决方案。
这取决于您所说的“丢失包裹”是什么意思。
假设你的意思是:
删除生成后将无法运行包提供的命令
如果删除非当前配置文件,所有命令仍将存在。该配置文件是独立的。
要查看当前配置文件包含的内容:
nix-store --query --references /nix/var/nix/profiles/per-user/$USER/profile
Run Code Online (Sandbox Code Playgroud)
那就是用户配置文件。查看系统配置文件:
nix-store --query --references /nix/var/nix/profiles/system
Run Code Online (Sandbox Code Playgroud)
可能有更简单的方法,但是使用上面我们可以找到答案:
# Replace $1 by previous profile number
nix-store --query --references /nix/var/nix/profiles/{system,per-user/$USER/profile} > /tmp/current-packages
nix-store --query --references /nix/var/nix/profiles/{system,per-user/$USER/profile-$1-link} > /tmp/prev-packages
# The packages "lost" by changing profile from current to profile-$1-link is the set difference
comm -32 <(sort /tmp/current-packages) <(sort /tmp/prev-packages)
Run Code Online (Sandbox Code Playgroud)
如果你的意思是:
哪些包将被“物理”删除
我认为这有点棘手。一个可能的起点是nix-store --query --roots在要删除的配置文件中的每个包上使用。