У меня есть предыдущая версия пакета, который я поддерживаю, который содержал подкаталог с файлами в нем. Обновление происходит в RHEL / CentOS 7. Например, моя версия 1.0 RPM содержала:
/opt/foo/etc/bar/x/y
/opt/foo/etc/bar/z
и т.д.. В более новой версии этого пакета я должен заменить весь каталог /opt/foo/etc/bar
файлом с тем же именем (к сожалению, это требуется для инструмента, я ничего не могу с этим поделать). Так что в новой версии пакета он будет содержать
/opt/foo/etc/bar
, который является файлом.
Если я запускаю в обычном режиме rpm --upgrade pkg-2.0.rpm
, я получаю сообщение об ошибке еще до того, как любой из моих скриптов спецификаций будет вызван:
file /opt/foo/etc/bar from install of pkg-2.0-1.x86_64 conflicts with file from package pkg-1.0-1.x86_64
Чтобы избежать этого, я должен добавить опцию --replacefiles
в мою командную строку rpm
, что является брутто.
Даже если я это сделаю, все равно не удастся, на этот раз после запуска моего preinst скриптлета, с такой ошибкой:
error: unpacking of archive failed on file /opt/foo/etc/bar: cpio: rename failed - Is a directory
error: pkg-2.0-1.x86_64: install failed
error: pkg-1.0-1.x86_64: erase skipped
Насколько я могу судить, единственный способ сделать это - изменить мой preinst для удаления каталога и добавить параметр --replacefiles
в rpm
. Даже после того, как я все это сделаю, пока обновление завершается успешно, оно выдает предупреждение для каждого файла, который «отсутствует» (потому что я удалил каталог):
warning: file /opt/foo/etc/bar/x/y: remove failed: Not a directory
warning: file /opt/foo/etc/bar/z: remove failed: Not a directory
Я не знаю, почему он показывает эту ошибку, поскольку эти вещи не каталогов и никогда не были, но в любом случае.
Я искал во всем вокруг информацию об этой конкретной проблеме, и хотя я обнаружил множество схожих ошибок, они все для разных ситуаций, таких как люди, пытающиеся установить два пакета с перекрывающимися файлами или аналогичными. Здесь я определенно пытаюсь обновить одну версию пакета до новой версии того же самого пакета.
Похоже, что в RPM нет возможности сделать это чисто; это просто недостаток инструмента RPM или я что-то упустил?