我已经在 CentOS 7 环境中从专有软件集合构建了一个 RPM,但构建过程需要执行.pm
在源代码本身中找到的一些 Perl 模块(文件)。当我执行时,rpm -Uvh rpm-name.rpm
我得到了与源代码中找到的确切 Perl 模块的失败依赖关系。所以问题是,如何安装自定义 Perl 模块?
一些.pm
文件定义包,另一些文件定义子例程。我尝试将脚本的目录复制到/usr/lib64/perl5/
但它不起作用。cpan -D Module::Name
给我Can't call method userid on an undefined value at /usr/share/perl5/App/Cpan.pm line 836
。我搜索从 perl 模块创建 RPM,但似乎每个人都在解释如何从CPAN
模块创建 RPM。
答案1
从您的描述中尚不清楚到底发生了什么(特定的错误消息会有所帮助或重现问题的示例包规范),但听起来 RPM 依赖项不知何故出了问题。根据问题的具体情况,有多种选择。
提供丢失的包裹
表明该包提供了*.spec
文件中缺少的模块:
Provides: perl(Module::Name)
...
*.spec
这可以在软件文件中完成。有时这可能需要一个垫片 RPM,除了提供缺少的依赖项之外什么也不做,特别是当您有第三方包时,您无法或不想修改以修复依赖项。
禁用自动请求
一个很大的锤子就是关闭包的自动需求;
Autoreq: 0
这可能反过来需要文件中合适的BuildRequires
,和其他语句来为包设置适当的依赖关系(或者您可以在配置管理中处理需要安装的包)。我必须在我本地维护的 133 个模块包中的 4 个中设置此标志,例如:Requires
*.spec
perl-*
perl-File-ChangeNotify.spec
# KLUGE don't pull in IO::KQueue which in turn needs *BSD
Autoreq: 0
BuildRequires: perl(Carp)
...
Requires: perl(Carp)
...
更改或过滤自动依赖关系脚本
这是更多的工作,因为它需要更改或过滤 RPM 运行的代码的输出以确定需求;这转速文档似乎已经过时了,因为我的 centos 7 测试系统不再具有find-*
该页面上提到的脚本,因此毫无疑问,此过程发生了一些变化,谁知道它现在在哪里或是否已记录。相反,我使用上述两种方法之一,因为我没有时间追查它们对需求脚本的更改。
答案2
我发现将__requires_exclude
宏添加到规范文件对于这种情况非常有用。看https://docs.fedoraproject.org/en-US/packaging-guidelines/AutoProvidesAndRequiresFiltering/欲了解更多详情