nix-env --delete-generations を実行して失うパッケージを一覧表示する

nix-env --delete-generations を実行して失うパッケージを一覧表示する

私が使うニクスOS、Nixバージョン1.10。nix-env、Nixパッケージマネージャのインストールコマンドは、新しい世代パッケージをインストールするたびに、異なるパッケージ構成が別々の世代に保存され、それらを切り替えて、現在から異なるパッケージがインストールされたシステムの以前の状態にロールバックできます。

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? 世代を完全に削除した場合に失われるパッケージのリストを表示するコマンドや非常に簡単なスクリプトはありますか? または、2 つの世代間の差分を表示する方法はありますか? 最も簡単な慣用的な解決策を目指しています。

答え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

まさに必要なことではありませんが、世代番号がわかっていれば、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)

関連情報