首页 > 解决方案 > 如何从模块创建 RPM 并递归地为依赖项创建单独的独立 RPM?

问题描述

给定一个模块,我如何创建一个不仅包含模块的 rpm,还包含所有模块的依赖项?

首先创建一个测试模块

$ module-starter --author "Evan Carroll" --email "me@evancarroll.com" --module Foo::Bar
Added to MANIFEST: Changes
Added to MANIFEST: ignore.txt
Added to MANIFEST: lib/Foo/Bar.pm
Added to MANIFEST: Makefile.PL
Added to MANIFEST: MANIFEST
Added to MANIFEST: README
Added to MANIFEST: t/00-load.t
Added to MANIFEST: t/manifest.t
Added to MANIFEST: t/pod-coverage.t
Added to MANIFEST: t/pod.t
Added to MANIFEST: xt/boilerplate.t
Created starter directories and files

现在我编辑Makefile.pl, 并添加Mojolicious为先决条件。

...
PREREQ_PM => {                                                         
      'Mojolicious' => '0'
....

现在我可以跑了

perl Makefile.PL
make dist

但是跑步,

$ sudo cpantorpm -y /tmp/yum /tmp/Foo-Bar/Foo-Bar-0.01.tar.gz 

我明白了,

error: Failed build dependencies:
        perl >= 5.006 is needed by perl-Foo-Bar-0.01-1.noarch
        perl(ExtUtils::MakeMaker) is needed by perl-Foo-Bar-0.01-1.noarch
        perl(Mojolicious) is needed by perl-Foo-Bar-0.01-1.noarch

这是有道理的,但我希望它为这些需求创建 RPM。我想Foo::Bar需要一个也从代表 Mojolicious 的 cpan 生成的 rpm,以及让构建系统输出两个 RPM(一个 rpmFoo::Bar需要同时提供的MojoliciousRPM)。

标签: perlrpmpackagingcpan

解决方案


绕过依赖地狱太容易了。我会去做一些像cpan-dependecy这样的项目。有人已经为你完成了这项工作。

下面是它的工作原理:

1) 如何安装以下 CPAN 模块是必需的。

  • CPANPLUS
  • RPM::规范文件

2) 使用方法 创建Linux::Smaps的rpm bin/cpan-dependency.pl --conf=config/conf.yml Linux::Smaps

3) conf.yml

  • filter_requires .. 从包中删除指定的要求。
  • build_skip .. 跳过构建包。
  • build_requires .. 在构建包之前构建和安装指定的包。
  • 需要 .. 将指定的包添加到包的依赖项中。

您需要调整conf.yml以满足您的依赖。

要构建您的项目,您将执行以下操作:

bin/cpan-dependency.pl --conf=config/conf.yml Foo::Bar


推荐阅读