Что требуется: Python (пакет) для файлов спецификаций RHEL?

В настоящее время я упаковываю пакеты Python без RPM, и некоторые из них зависят от других, которые я упаковываю.

Во время упаковки я заметил формат, в котором люди делают: Require: python(pkg-name) , но я пытаюсь понять, есть ли какой-то конкретный синтаксис для использования этого? Потому что, когда он используется, он, похоже, не заботится о версиях требуемого пакета.

Пример:

 Requires: Python(gocd-cli) >= 0.9 

Показывается в списке требований после создания моего RPM:

 $ rpm -qp --requires dist/gocd-cli.encryption.blowfish-1.0-1.noarch.rpm Python(gocd-cli) >= 0.9 python(abi) = 2.6 python-crypto rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 

Этот пакет прекрасно устанавливается, несмотря на то, что версия пакета gocd-cli> = 0.9 еще не построена и не доступна.

В общем, я пытаюсь понять:

  1. Как это необходимо Requires: Python() должен использоваться?
  2. Что называется частью Python() ? Я также видел это для Ruby, Perl и других …

Хотя модули Ruby и Perl используют эти виртуальные пакеты, AFAIK python не использует их.

Это ничего, кроме виртуальных (см. Главу «Создание виртуальных возможностей» ). Полезно, если вы знаете, какой модуль вы хотите использовать, но не знаете, какой пакет содержит его. Хотя в большинстве случаев это очень просто, и perl-foo предоставляет perl(foo) , есть случаи, которые не так просты. Например, perl(APR) предоставляется mod_perl .

Virtual обеспечивает Perl довольно старые и обрабатываются непосредственно rpm и rpmbuild. В прошлом в Ruby вы должны были добавить их вручную, но теперь это также обрабатывается rpm. Для python не было никого, кто будет управлять этим изменением, и он вообще не использует эти виртуальные обеспечивает. Поэтому вам необходимо указать точное имя пакета.

Вывод:

Если вы упаковываете библиотеку python, нет никакого вреда при установке spec:

 Provides: python(foo) = %{version}-%{release} 

Однако вы не должны ожидать, что другие модули python предоставят это, и вам нужно будет потребовать их использования обычного имени пакета.

И последнее замечание – Requires / Provides чувствительны к регистру, поэтому Python (foo)! = Python (foo).