Liste os pacotes que estou perdendo ao executar nix-env --delete-generações

Liste os pacotes que estou perdendo ao executar nix-env --delete-generações

eu usoNixOS, Nix versão 1.10. nix-env, comando de instalação do gerenciador de pacotes Nix, cria um novogeraçãotoda vez que você instala um pacote. Dessa forma, diferentes configurações de pacotes são armazenadas em gerações separadas, e você pode alternar entre elas para reverter para estados anteriores do sistema, onde você tinha pacotes diferentes instalados a partir de agora.

Suponha que eu instalei package emacs, que criou uma nova geração:

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

A geração 1 não contém emacs, a geração 2 contém. Se eu mudar para a geração 1 e excluir a geração 2, isso significa que perco emacs:

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

As informações da --delete-generationsoperação em execução são muito escassas e adicionar --verboseou --dry-runnão especifica a lista de pacotes removidos. Mesmo -vvvvvnão é ú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

Mas como posso saber que perdi emacs? Existe algum comando ou script muito simples para visualizar uma lista de pacotes que eu perderia se excluísse permanentemente uma geração? Ou existe uma maneira de ver uma diferença entre duas gerações? Eu me esforço para encontrar a solução idiomática mais simples.

Responder1

Isso depende do que você quer dizer com "perder um pacote".

Supondo que você queira dizer:

não será capaz de executar os comandos fornecidos pelo pacote após excluir a geração

Se você excluir um perfil não atual, todos os comandos ainda estarão lá. O perfil é independente.

Para ver o que o perfil atual contém:

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

Esse é operfil de usuário. Para ver o perfil do sistema:

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

Pode haver uma maneira mais simples, mas usando o acima podemos encontrar a resposta:

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

Se você quiser dizer:

quais pacotes serão excluídos "fisicamente"

Acho que é um pouco mais complicado. Um possível ponto de partida é usar nix-store --query --rootsem cada pacote do perfil a ser excluído.

Responder2

Não é exatamente o que você precisa, mas se você souber o número da geração, poderá fazer uma diferença entre duas gerações.

Você pode usar nix-store -q --referencespara recuperar a lista de derivações ('pacotes') das quais uma derivação depende. E a sua 'configuração do sistema' é apenas mais uma derivação!

Então, essencialmente, um exemplo seria:

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

informação relacionada