
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-generations
Vorgängen sind zu spärlich und das Hinzufügen von --verbose
oder --dry-run
gibt die Liste der entfernten Pakete nicht an. Sogar das -vvvvv
ist 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 --roots
auf 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 --references
um 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)