我用尼克斯操作系统,尼克斯版本1.10。nix-env
, Nix 包管理器的安装命令,创建一个新的一代每次安装软件包时。这样,不同的包配置存储在不同的代中,您可以在它们之间切换以回滚到系统的先前状态,即从现在起安装了不同的包。
假设我安装了 package emacs
,它创建了新一代:
$ nix-env --list-generations
1 2015-09-18 14:32:51
2 2015-09-19 15:41:58 (current)
第 1 代不包含emacs
,第 2 代包含 。如果我切换到第 1 代并删除第 2 代,那就意味着我输了emacs
:
$ nix-env --switch-generation 1
switching from generation 2 to 1
$ nix-env --delete-generations 2
removing generation 2
运行操作的信息--delete-generations
太少,添加--verbose
或未--dry-run
指定删除的包列表。甚至-vvvvv
没有帮助。
$ nix-env --dry-run --delete-generations 14
(dry run; not doing anything)
would remove generation 14
$ nix-env --verbose --dry-run --delete-generations 14
(dry run; not doing anything)
evaluating file ‘/nix/store/13lmbyk148z95sp96gh0vr2b867ypl8g-nix-1.10/share/nix/corepkgs/derivation.nix’
would remove generation 14
但我怎么知道我输了呢emacs
?是否有任何命令或非常简单的脚本来查看如果我永久删除一代我会丢失的软件包列表?或者有没有办法查看两代之间的差异?我力求最简单的惯用解决方案。
答案1
这取决于您所说的“丢失包裹”是什么意思。
假设你的意思是:
删除生成后将无法运行包提供的命令
如果删除非当前配置文件,所有命令仍将存在。该配置文件是独立的。
要查看当前配置文件包含的内容:
nix-store --query --references /nix/var/nix/profiles/per-user/$USER/profile
那就是用户资料。查看系统配置文件:
nix-store --query --references /nix/var/nix/profiles/system
可能有更简单的方法,但是使用上面我们可以找到答案:
# 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)
如果你的意思是:
哪些包将被“物理”删除
我认为这有点棘手。一个可能的起点是在nix-store --query --roots
要删除的配置文件中的每个包上使用。
答案2
不完全是您所需要的,但如果您知道代号,您可以在两代之间进行比较。
您可以用来nix-store -q --references
检索派生所依赖的派生(“包”)列表。而你的“系统配置”只是另一个派生!
所以本质上一个例子是:
diff <(nix-store -q --references /nix/var/nix/profiles/system) <(nix-store -q --references /nix/var/nix/profiles/system-615-link)