我目前正在打包一些没有 RPM 的 Python 包,其中一些依赖于我正在打包的其他包。
在打包时,我注意到人们这样做的格式: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 尚未构建并可用,但该软件包安装得非常好。
总而言之,我想要理解的是:
- 应该如何
Requires: Python()
使用呢? - 这部分叫什么
Python()
?我也见过 Ruby、Perl 和其他语言......
答案1
虽然 Ruby 和 Perl 模块使用这些虚拟提供,但据我所知 python 不使用它们。
它只不过是虚拟供应(参见创建虚拟功能章节)。如果您知道要使用哪个模块但不知道哪个包包含它,那么它会很有用。虽然在大多数情况下它非常简单并perl-foo
提供perl(foo)
,但有些情况并不那么简单。例如perl(APR)
由提供mod_perl
。
Perl 的虚拟提供程序相当古老,直接由 rpm 和 rpmbuild 处理。过去在 Ruby 中你必须手动添加它们,但现在它也由 rpm 处理。对于 python 来说,没有人会推动这一变化,而且它通常不使用这些虚拟资源。所以你必须需要准确的包名称。
结论:
如果你正在打包 python 库,那么放入spec 没有什么坏处:
Provides: python(foo) = %{version}-%{release}
然而,你不应该期望其他 python 模块有这个提供,你需要使用正常的包名称来要求它们。
最后一点 - 要求/提供区分大小写,因此 Python(foo) != python(foo)。