Enumere los paquetes que estoy perdiendo al ejecutar nix-env --delete-generations

Enumere los paquetes que estoy perdiendo al ejecutar nix-env --delete-generations

yo sueloNixOS, Nix versión 1.10. nix-env, el comando de instalación del administrador de paquetes Nix, crea un nuevogeneracióncada vez que instalas un paquete. De esta manera, las diferentes configuraciones de paquetes se almacenan en generaciones separadas y puede cambiar entre ellas para retroceder a estados anteriores del sistema, donde tenía diferentes paquetes instalados a partir de ahora.

Supongamos que instalé el paquete emacs, que creó una nueva generación:

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

La generación 1 no contiene emacs, la generación 2 sí. Si cambio a la generación 1 y elimino la generación 2, eso significa que pierdo emacs:

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

La información de --delete-generationsla operación en ejecución es demasiado escasa y agregar --verboseo --dry-runno especificar la lista de paquetes eliminados. Incluso -vvvvvno es útil.

$ 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

¿Pero cómo sé que pierdo emacs? ¿Existe algún comando o script muy simple para ver una lista de paquetes que perdería si elimino permanentemente una generación? ¿O hay alguna manera de ver una diferencia entre 2 generaciones? Me esfuerzo por encontrar la solución idiomática más simple.

Respuesta1

Esto depende de lo que quieras decir con "perder un paquete".

Suponiendo que te refieres a:

no podrá ejecutar los comandos proporcionados por el paquete después de eliminar la generación

Si elimina un perfil no actual, todos los comandos seguirán ahí. El perfil es autónomo.

Para ver qué contiene el perfil actual:

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

Eso es elperfil del usuario. Para ver el perfil del sistema:

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

Puede que haya una forma más sencilla, pero utilizando lo anterior podemos encontrar la respuesta:

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

Si en cambio te refieres a:

qué paquetes se eliminarán "físicamente"

Creo que es un poco más complicado. Un posible punto de partida es utilizar nix-store --query --rootsen cada paquete del perfil que se va a eliminar.

Respuesta2

No es exactamente lo que necesitas, pero si conoces el número de generación puedes hacer una diferencia entre dos generaciones.

Puede utilizar nix-store -q --referencespara recuperar la lista de derivaciones ("paquetes") de las que depende una derivación. ¡Y su 'configuración del sistema' es solo otra derivación!

Básicamente, un ejemplo sería:

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

información relacionada