Listen Sie die Pakete auf, die ich verliere, indem Sie nix-env --delete-generations ausführen

Listen Sie die Pakete auf, die ich verliere, indem Sie nix-env --delete-generations ausführen

ich benutzeNixOS, Nix Version 1.10. nix-env, Installationsbefehl des Nix-Paketmanagers, erstellt eine neueGenerationjedes Mal, wenn Sie ein Paket installieren. Auf diese Weise werden verschiedene Paketkonfigurationen in separaten Generationen gespeichert, und Sie können zwischen ihnen wechseln, um zu früheren Zuständen des Systems zurückzukehren, in denen Sie ab jetzt andere Pakete installiert hatten.

Angenommen, ich habe das Paket installiert emacs, das eine neue Generation erstellt hat:

$ nix-env --list-generations
1   2015-09-18 14:32:51   
2   2015-09-19 15:41:58   (current)

Generation 1 enthält nicht emacs, Generation 2 schon. Wenn ich zu Generation 1 wechsle und Generation 2 lösche, verliere ich emacs:

$ nix-env --switch-generation 1
switching from generation 2 to 1
$ nix-env --delete-generations 2
removing generation 2

Die Informationen aus laufenden --delete-generationsVorgängen sind zu spärlich und das Hinzufügen von --verboseoder --dry-rungibt die Liste der entfernten Pakete nicht an. Sogar das -vvvvvist nicht hilfreich.

$ 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

Aber woher weiß ich, dass ich verliere emacs? Gibt es einen Befehl oder ein sehr einfaches Skript, um eine Liste der Pakete anzuzeigen, die ich verlieren würde, wenn ich eine Generation dauerhaft lösche? Oder gibt es eine Möglichkeit, einen Unterschied zwischen zwei Generationen anzuzeigen? Ich strebe nach der einfachsten idiomatischen Lösung.

Antwort1

Dies hängt davon ab, was Sie mit „ein Paket verlieren“ meinen.

Angenommen, Sie meinen:

kann die vom Paket bereitgestellten Befehle nach dem Löschen der Generation nicht mehr ausführen

Wenn Sie ein nicht aktuelles Profil löschen, sind alle Befehle noch vorhanden. Das Profil ist in sich geschlossen.

So sehen Sie, was das aktuelle Profil enthält:

nix-store --query --references /nix/var/nix/profiles/per-user/$USER/profile

Das ist dieBenutzerprofilSo zeigen Sie das Systemprofil an:

nix-store --query --references /nix/var/nix/profiles/system

Es gibt vielleicht einen einfacheren Weg, aber mithilfe des oben Gesagten können wir die Antwort finden:

# 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)

Wenn Sie stattdessen meinen:

welche Pakete „physisch“ gelöscht werden

Ich denke, es ist etwas komplizierter. Ein möglicher Ansatzpunkt ist, es nix-store --query --rootsauf jedes Paket im zu löschenden Profil anzuwenden.

Antwort2

Nicht genau das, was Sie brauchen, aber wenn Sie die Generationsnummer kennen, können Sie einen Diff zwischen zwei Generationen durchführen.

Sie können verwenden, nix-store -q --referencesum die Liste der Ableitungen ('Pakete') abzurufen, von denen eine Ableitung abhängt. Und Ihre 'Systemkonfiguration' ist nur eine weitere Ableitung!

Ein grundlegendes Beispiel wäre also:

diff <(nix-store -q --references /nix/var/nix/profiles/system) <(nix-store -q --references /nix/var/nix/profiles/system-615-link)

verwandte Informationen