Вопрос или проблема
Предположим, что я установил пакет ongres-scram
на Fedora 40.
Тогда
$ rpm --query --requires ongres-scram
выдает мне список “тегов зависимости”, которые необходимы для установки этого пакета:
javapackages-filesystem
mvn(com.ongres.stringprep:saslprep)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsZstd) <= 5.4.18-1
rpmlib(RichDependencies) <= 4.12.0-1
В свою очередь
$ rpm --query --provides ongres-scram
выдает мне “теги зависимости”, которые предоставляет установка:
mvn(com.ongres.scram:common) = 2.1
mvn(com.ongres.scram:common:pom:) = 2.1
ongres-scram = 2.1-13.fc40
Тег зависимости javapackages-filesystem
разрешается соответствующим пакетом:
$ rpm --query --whatprovides javapackages-filesystem
javapackages-filesystem-6.2.0-9.fc40.noarch
Тег зависимости mvn(foo)
безусловно относится к процессу сборки на основе maven и может быть разрешен:
$ rpm --query --whatprovides "mvn(com.ongres.stringprep:saslprep)"
ongres-stringprep-1.1-12.fc40.noarch
$ dnf provides "mvn(com.ongres.stringprep:saslprep)"
...
ongres-stringprep-1.1-12.fc40.noarch : RFC 3454 Подготовка интернационализированных строк на чистом Java
...
Но тег зависимости rpmlib(foo)
не разрешается:
$ rpm --query --whatprovides "rpmlib(FileDigests)"
no package provides rpmlib(FileDigests)
$ dnf provides "rpmlib(FileDigests)"
Ошибка: Не найдено совпадений....
Может быть, этот тег обозначает требование к системе для сборки RPM-пакета. Но что его предоставляет?
Более того, кажется
rpmlib(FileDigests) <= 4.6.0-1
указывает на требование к довольно старой версии, так как текущая версия rpm
составляет 4.19.1.1?
rpmlib
зависимости – это флаги возможностей, хранящиеся в заголовках RPM, указывающие на функции, которые rpm
сам должен поддерживать для обработки RPM. Версионные отношения читаются задом наперед: RPM ongres-scram
требует версию rpm
, которая поддерживает полезные нагрузки, сжатые с использованием zstd
, и эта функция доступна только в rpm
версии 5.4.18 или новее.
Вы можете увидеть, какие возможности поддерживает ваша команда rpm
, выполнив
rpm --showrc | grep rpmlib
Если вы изучите зависимости с помощью yum
или dnf
, вы увидите, что эти зависимости rpmlib
не видны: они связаны с конкретными файлами RPM, а не с общими свойствами самого пакета. Это означает, что перестройка пакета с использованием других настроек не должна повлиять на “реальные” зависимости (библиотеки и т. д.), но может повлиять на требуемые возможности (например, если RPM сжат с использованием другого алгоритма).
mvn
зависимости – это зависимости от пакетов Maven, как вы и обнаружили.
Ответ или решение
Зависимости rpmlib(foo)
и mvn(foo)
в RPM-пакетах представляют собой специфические требования к функциям и библиотекам, которые необходимы для установки и работы пакета.
Зависимости rpmlib(foo)
Зависимости, начинающиеся с rpmlib
, указывают на функциональные возможности, которые требуются для работы RPM-менеджера с данным пакетом. Эти зависимости не относятся к конкретным пакетам или библиотекам, а скорее указывают на возможности, поддерживаемые версию RPM, используемого в системе. Например:
rpmlib(FileDigests) <= 4.6.0-1
означает, что пакет требует, чтобы версия RPM поддерживала возможность вычисления контрольных сумм файлов, как минимум версии 4.6.0-1.rpmlib(PayloadIsZstd) <= 5.4.18-1
указывает, что пакет использует алгоритм сжатия Zstandard и требует, чтобы версия RPM была 5.4.18 или выше.
Чтобы увидеть, какие возможности поддерживает ваш текущий RPM, вы можете выполнить команду:
rpm --showrc | grep rpmlib
Таким образом, если вы видите rpmlib(foo)
, это не означает, что отсутствует какой-либо пакет; это значит, что ваша версия RPM должна поддерживать указанные функции. Если, например, в системе установлена версия RPM 4.19.1.1, она, как правило, будет поддерживать большинство возможностей, указанных в зависимостях rpmlib
.
Зависимости mvn(foo)
Зависимости, начинающиеся с mvn
, относятся к библиотекам, используемым в проектах на основе Maven. Эти зависимости указывают на сторонние библиотеки или компоненты, которые необходимы для сборки или работы вашего пакета. В примере, который вы привели:
mvn(com.ongres.stringprep:saslprep)
указывает на то, что пакетongres-scram
зависит от Maven-пакетаsaslprep
из группыcom.ongres.stringprep
.
Вы можете выяснить, какие пакеты предоставляют зависимости mvn
, с помощью команды:
rpm --query --whatprovides "mvn(com.ongres.stringprep:saslprep)"
Это позволит вам обнаружить, какие именно RPM-пакеты могут удовлетворить указанную зависимость.
Вывод
Зависимости rpmlib(foo)
и mvn(foo)
играют важную роль в управлении зависимостями RPM-пакетов, указывая на требования к функционалу RPM и используемым библиотекам в проектах на Maven соответственно. Чтобы корректно обновлять или устанавливать пакеты, необходимо учитывать как возможности RPM, так и зависимости, которые требуются для Maven.