
我用尼克斯作業系統,尼克斯版本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)