[newbies] Spec, Rpm, Conflicts-pre (?)

Ivan Zakharyaschev imz на altlinux.org
Ср Дек 4 16:42:34 MSK 2019


Hello!

On Wed, 4 Dec 2019, Anton Shevtsov wrote:

> Суть вопроса. Делаю небольшой метапакет, не для апстрима,  для локального
> использования. Хотя и достаточного глобального использования.
> 
> Смысл такой, что надо установить chromium-gost, при этом удалить chromium,
> при этом создать симлинку /usr/bin/chromium -> /usr/bin/chromium-gost
> 
> В spec пишу
> ..
> Requires(pre): chromium-gost
> ...
> %post
> ln -s /usr/bin/chromium-gost /usr/bin/chromium
> %postun
> rm -f /usr/bin/chromium
> ...
> 
> при попытке установить мой метапакет, выводится, что обычный хромиум будет
> удален, будет поставлен chromium-gost. На этом этапе все хорошо. Пакеты
> ставятся, но тут же получаю
> 
> ln: не удалось создать символьную ссылку '/usr/bin/chromium': Файл
> существует
> 
> Что логично ибо логика пакетного менеджера _сначала установить_, а лишь
> потом _удалить_. Т.е. симлинка пытается появится, когда еще установлен
> обычный chromium.
> 
> А Conflicts(pre) нету, чтобы удалить его раньше установки.

Раз Conflicts(pre) нету, можно было бы придумать попробовать

Requires(pre): conflicts-chromium

а в пакете conflicts-chromium поставить Conflicts: chromium

Но я так не советую пробовать делать в первую очередь, см. моё предложение 
ниже.

> Есть ли механим, вмешаться в транзакцию и удалить пакет раньше? Какие пути
> решения?

Вмешаться в порядок действия в транзакцию довольно сложно, там и так в 
коде rpm всё очень непросто в этом месте.

Мне кажется, в Вашем случае этот симлинк можно просто положить в секцию 
%files Вашего пакета.

Раз в результате транзакции старый владелец этого файла (пакет chromium) 
удаляется, то rpm это учтёт и без жалоб сразу на этом месте создаст новый 
симлинк при выполнении транзакции.

-- 
Best regards,
Ivan


Подробная информация о списке рассылки devel-newbies