Список пакетов, которые я теряю при запуске nix-env --delete-generations

Список пакетов, которые я теряю при запуске nix-env --delete-generations

я используюNixOS, 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операции слишком скудна, а добавление --verboseor --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

Не совсем то, что вам нужно, но если вы знаете номер поколения, вы можете провести различие между двумя поколениями.

Вы можете использовать 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)

Связанный контент