Linux 关于为Perl模块捆绑CentOS RPM的问题

Linux 关于为Perl模块捆绑CentOS RPM的问题,linux,perl,redhat,rpm,Linux,Perl,Redhat,Rpm,我正在尝试将一些Perl模块捆绑到RPM包中,以便于部署。我尝试了很多工具,但最终还是选择了fpm 因此,我设法为每个必需的Perl模块手动构建和安装每个RPM。我不确定这是否正确。但是我没有很多RPM软件包的经验。但据我所知,这是正确的行为。每个RPM包都包含相应Perl模块所需的所有依赖项 问题是,当我尝试使用生成的捆绑包安装模块时,会遇到一些冲突 sudo yum --disablerepo=* localinstall *.rpm 当它尝试安装时: Transaction Summar

我正在尝试将一些Perl模块捆绑到RPM包中,以便于部署。我尝试了很多工具,但最终还是选择了fpm

因此,我设法为每个必需的Perl模块手动构建和安装每个RPM。我不确定这是否正确。但是我没有很多RPM软件包的经验。但据我所知,这是正确的行为。每个RPM包都包含相应Perl模块所需的所有依赖项

问题是,当我尝试使用生成的捆绑包安装模块时,会遇到一些冲突

sudo yum --disablerepo=* localinstall *.rpm
当它尝试安装时:

Transaction Summary
==============================================================================================================================================================================================================
Install  174 Packages

Total size: 45 M
Installed size: 357 M
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Error: Transaction test error:
  file /usr/local/lib64/perl5/auto/Moose/Moose.so conflicts between attempted installs of Moose-Exporter-2.2013-1.x86_64 and Moose-2.2013-1.x86_64
  file /usr/local/lib64/perl5/auto/Moose/Moose.so conflicts between attempted installs of Moose-Role-2.2013-1.x86_64 and Moose-Exporter-2.2013-1.x86_64
  file /usr/local/lib64/perl5/auto/Moose/Moose.so conflicts between attempted installs of Moose-Util-TypeConstraints-2.2013-1.x86_64 and Moose-Role-2.2013-1.x86_64
  file /usr/local/lib64/perl5/auto/Moose/Moose.so conflicts between attempted installs of Moose-Util-2.2013-1.x86_64 and Moose-Util-TypeConstraints-2.2013-1.x86_64
  file /usr/local/lib64/perl5/auto/Moose/Moose.so conflicts between attempted installs of Moose-Meta-TypeConstraint-2.2013-1.x86_64 and Moose-Util-2.2013-1.x86_64
  file /usr/local/lib64/perl5/auto/Moose/Moose.so conflicts between attempted installs of Moose-Meta-TypeConstraint-Union-2.2013-1.x86_64 and Moose-Meta-TypeConstraint-2.2013-1.x86_64
  file /usr/local/lib64/perl5/auto/Moose/Moose.so conflicts between attempted installs of Moose-Util-MetaRole-2.2013-1.x86_64 and Moose-Meta-TypeConstraint-Union-2.2013-1.x86_64
  file /usr/local/lib64/perl5/auto/Moose/Moose.so conflicts between attempted installs of Moose-Meta-Attribute-2.2013-1.x86_64 and Moose-Util-MetaRole-2.2013-1.x86_64
  file /usr/local/lib64/perl5/auto/Moose/Moose.so conflicts between attempted installs of Moose-Meta-Class-2.2013-1.x86_64 and Moose-Meta-Attribute-2.2013-1.x86_64
  file /usr/local/lib64/perl5/auto/Moose/Moose.so conflicts between attempted installs of Moose-Meta-Role-2.2013-1.x86_64 and Moose-Meta-Class-2.2013-1.x86_64
  file /usr/local/lib64/perl5/auto/Moose/Moose.so conflicts between attempted installs of Moose-Meta-Role-Attribute-2.2013-1.x86_64 and Moose-Meta-Role-2.2013-1.x86_64
  file /usr/local/lib64/perl5/auto/HTML/Parser/Parser.so conflicts between attempted installs of HTML-HeadParser-3.75-1.x86_64 and HTML-Entities-3.75-1.x86_64

我花了好几天的时间试图调试这个问题,但似乎无法解决它。我所做的只是使用yum安装perl,因为这是一个先决条件。我希望我的本地安装可以正常工作。

错误消息似乎很清楚:不能让两个软件包提供相同的文件

对于Moose.so的错误,您可能希望将共享库移动到单独的包中,并使其成为所有需要它的模块的依赖项

对于HTMLHeadParser的错误,我认为您只需要一个HTMLParser包,它使HTMLHeadParser和HTMLEntities之类的东西依赖于它

也许需要花点时间看看现有的Perl模块是如何打包的?例如,请看:

以及同一存储库中的所有其他perl Moose-*和perl MooseX-*包。
错误消息似乎很清楚:不能让两个包提供同一个文件

对于Moose.so的错误,您可能希望将共享库移动到单独的包中,并使其成为所有需要它的模块的依赖项

对于HTMLHeadParser的错误,我认为您只需要一个HTMLParser包,它使HTMLHeadParser和HTMLEntities之类的东西依赖于它

也许需要花点时间看看现有的Perl模块是如何打包的?例如,请看:

以及同一存储库中的所有其他perl Moose-*和perl MooseX-*包。
所以我似乎没有足够的RPM软件包经验。我试着在使用fpm时处理依赖项,但我缺乏相关知识。那么,我应该添加一个RPM并在其中添加所有必需的Moose子模块吗?@Serban Cezar,不,您可能希望将共享库(例如Moose)移动到一个单独的包中。子模块将依赖于MooseRPM@ikegami我不确定我将如何使用RPM来实现这一点。我想我需要添加'depends'属性,然后子模块就会知道不重写同一个包?那么这是否意味着我需要在一个RPM中绑定多个Perl模块?这有可能吗?@Serban Cezar,Re那么这是否意味着我需要在一个RPM中绑定多个Perl模块?同样,我们告诉您的做法正好相反。这就是你在做的,这就是给你带来麻烦的原因。为不同的发行版创建不同的RPM。@ikegami我就是这么做的。我为每个Perl模块和子模块创建了一个RPM包。我认为这是图书馆冲突的原因。那么,我不应该为Moose模块创建一个RPM,为子模块创建其他RPM,并让它们依赖于根模块吗?因为我不认为这是你的建议,我想我误解了。所以我似乎对RPM软件包没有足够的经验。我试着在使用fpm时处理依赖项,但我缺乏相关知识。那么,我应该添加一个RPM并在其中添加所有必需的Moose子模块吗?@Serban Cezar,不,您可能希望将共享库(例如Moose)移动到一个单独的包中。子模块将依赖于MooseRPM@ikegami我不确定我将如何使用RPM来实现这一点。我想我需要添加'depends'属性,然后子模块就会知道不重写同一个包?那么这是否意味着我需要在一个RPM中绑定多个Perl模块?这有可能吗?@Serban Cezar,Re那么这是否意味着我需要在一个RPM中绑定多个Perl模块?同样,我们告诉您的做法正好相反。这就是你在做的,这就是给你带来麻烦的原因。为不同的发行版创建不同的RPM。@ikegami我就是这么做的。我为每个Perl模块和子模块创建了一个RPM包。我认为这是图书馆冲突的原因。那么,我不应该为Moose模块创建一个RPM,为子模块创建其他RPM,并让它们依赖于根模块吗?因为我不认为这是你的建议,我想我误解了。你可能会发现部署Perl应用程序的一个更简单的方法是使用安装Perl的副本,而不是使用系统Perl,和用于管理应用程序的打包模块。您可能会发现,部署Perl应用程序的一种更简单的方法是使用安装Perl的副本,而不是使用系统Perl,并使用 管理应用程序的模块打包。