Неожиданный конфликт RPM в файлах %config(noreplace)

Я создаю свой собственный RPM с помощью rpmbuild.
Мой RPM содержит файлы конфигурации, которые никогда не должны переопределяться, даже если RPM содержит новая версия этих файлов конфигурации.

Чтобы заархивировать это, я пометил их тегом

%config(noreplace) /opt/mypackage/etc/*

в файле спец.

Согласно документации и этому сайту, локально измененный файл никогда не будет переопределен в этом случае, а это именно то, что я хочу.

Однако при выполнении следующих операций:

  1. Установите версию 1 RPM
  2. Изменить файл конфигурации etc/myconfig
  3. Пакет обновления с версией 2 RPM

У меня возникает конфликт:

$ rpm --prefix ~/rpmroot/ -ih dist/mypackage-1.0.1-1.x86_64.rpm
########################################### [100%]
file /home/user/rpmroot/mypackage/etc/myconfig from install of mypackage-1.0.2-1.x86_64 conflicts with file from package mypackage-1.0.1-1.x86_64

Вопросы:

  • Как можно объяснить этот конфликт? (Я ожидаю, что новая версия файла конфигурации будет сохранена как myconfig.rpmnew, а существующая останется нетронутой)
  • Что я делаю неправильно?


ОБНОВЛЕНИЕ (дополнительная информация)

Вывод rpm -qcp dist/mypackage-1.0.1-1.x86_64.rpm:

/opt/mypackage/etc/config1.xml
/opt/mypackage/etc/config2.xml
/opt/mypackage/etc/run.sh
/opt/mypackage/etc/config3.xml

Полный раздел %files:

%files
%defattr(0444,root,root)
/opt/mypackage/java/*

#dba
%defattr(0444,root,root)
/opt/mypackage/dba/sql/*
%defattr(0555,root,root)
/opt/mypackage/dba/script/*

#srv
%defattr(0555,root,root)
/opt/mypackage/srv/bin/*
/opt/mypackage/srv/lib/*

#etc
%defattr(0664,root,root)
%config(noreplace) /opt/mypackage/etc/*

person MRalwasser    schedule 11.09.2013    source источник
comment
Так странно, что функция (noreplace) не задокументирована... почти ожидаемое поведение в моей книге, когда вы с трудом произносите %config...   -  person nhed    schedule 12.09.2013
comment
Это задокументировано, но не очень хорошо: rpm.org/wiki/PackagerDocs/Spec (и также загляните на неофициальный, но полезный сайт: www -uxsup.csx.cam.ac.uk/~jw35/docs/rpm_config.html )   -  person MRalwasser    schedule 12.09.2013
comment
Да, я видел неофициальную, это единственная, которая попалась мне в поиске (и ваш вопрос). Прошлой ночью мы впервые попробовали noreplace   -  person nhed    schedule 12.09.2013


Ответы (1)


Если это действительно ваша проблема, вы можете пнуть себя...

Я думаю, это может быть просто потому, что вы «устанавливаете», а не «обновляете», замените -ih на -Uh

Я создал тестовый RPM с аналогичной настройкой, вот результаты:

С -ih, как вы

$ sudo rpm --prefix ~/rpmroot/ -ih /home/nhed/rpmbuild/RPMS/x86_64/ptst-1.1.0-1.x86_64.rpm

##################################### [100%] file /home/nhed/rpmroot/etc/a from install of ptst-1.1.0-1.x86_64 conflicts

с файлом из пакета ptst-1.0.0-1.x86_64 файл /home/nhed/rpmroot/etc/b из установки ptst-1.1.0-1.x86_64 конфликтует с файлом из пакета ptst-1.0.0-1.x86_64 файл /home/nhed/rpmroot/etc/c из пакета установки ptst-1.1.0-1.x86_64 конфликтует с файлом из пакета ptst-1.0.0-1.x86_64

С -Ух

$ sudo rpm --prefix ~/rpmroot/ -Uh /home/nhed/rpmbuild/RPMS/x86_64/ptst-1.1.0-1.x86_64.rpm

##################################### [100%]

предупреждение: /home/nhed/rpmroot/etc/a создан как /home/nhed/rpmroot/etc/a.rpmnew

##################################### [100%]
person nhed    schedule 12.09.2013
comment
если у вас есть тонны файлов под /opt/mypackage/etc/, похоже, вы можете создать файл манифеста в правиле %install (или ранее), который найдет все эти файлы и префиксит их директивой %config(norplace), а затем передайте манифест с «-f» в %files - person nhed; 12.09.2013
comment
Вы правы, за %config может следовать только одно имя файла, но я думаю, что имя файла с подстановочными знаками разрешено. В противном случае они, скорее всего, не были бы упакованы - или я ожидал бы сообщения об ошибке. Тем не менее, я попробовал это - никакой разницы, конфликт остается. (Кстати, книга docs.fedoraproject.org/en -US/Fedora_Draft_Documentation/0.1/ также показывает %config с подстановочными знаками) - person MRalwasser; 12.09.2013
comment
@MRalwasser Можем ли мы увидеть остальную часть вашего раздела %files? Также вы можете вставить вывод rpm -qcp dist/mypackage-1.0.1-1.x86_64.rpm - person nhed; 12.09.2013
comment
@MRalwasser был достаточно очарован, я провел тест и обновил свой ответ. - person nhed; 12.09.2013
comment
Вау, спасибо! Это действительно было проблемой. Я думал, что -i является синонимом -U на тот случай, если пакет уже установлен в более старой версии. Никогда не ожидал, что это может вызвать такую ​​​​ошибку. Как вы нашли эту ошибку, не зная, что именно я набрал? - person MRalwasser; 12.09.2013
comment
@MRalwasser ваша вставка с ошибкой показывает вашу командную строку rpm с -ih, и я попытался воспроизвести именно то, что вы сделали, поэтому я также сделал свой пакет перемещаемым (хотя обычно я не беспокоюсь). - person nhed; 12.09.2013
comment
Ах, вы правы, это часть моего вопроса - очень внимательно! Да, я также использую релокацию в своем пакете. - person MRalwasser; 12.09.2013