有没有最简单的方法来构建Perl包?

12

我在Ubuntu上编写了几个Perl库(.pm)和Perl脚本(.pl),需要将它们分发给办公室的同事。这些脚本和库需要第三方库支持,我希望能够非常简单地完成。

关于我的信息:

  • 我知道如何创建Perl脚本。
  • 我知道如何创建bash文件。
  • 我没有创建MAKE文件、rpm或Deb等经验。

如果你的同事们都使用Ubuntu操作系统(最好是相同版本),并且他们足够多,学习如何构建*.deb软件包可能会很值得。 - Basile Starynkevitch
@BasileStarynkevitch,我不想具体说明。他们要么是Linux用户,要么是Mac用户。 - Jessada Thutkawkorapin
你读过Module::Build吗? - Konerak
@Konerak,我还没有尝试过。这是最简单的方法吗?起初,我认为rpm是最简单的,但我被许多不同版本的“howto”所困扰。所以我决定在这里问专家们。 - Jessada Thutkawkorapin
@Konerak,实际上,在我提出这个问题之前,我自己尝试学习这些东西时已经多次通过了那种页面。我的主要问题是我只看到了构建和安装模块的标准流程: perl Build.PL ./Build ./Build test ./Build install但不知道在哪里创建这个make文件以及如何让它知道我的脚本。 - Jessada Thutkawkorapin
@JessadaThutkawkorapin - 创建makefile是由Makefile.PL完成的。 - user554546
2个回答

15
我建议使用Module::Starter为每个模块设置一个模板。一旦安装完成,您可以从命令行调用module-starter,例如:
module-starter --module=My::Module --author="Jessada Thutkawkorapin" --email=your@email.com

或者,如果你想要一个带有多个模块的发行版:
module-starter --distro=Foo --module=Foo,Foo::Bar,Foo::Baz --author="Jessada Thutkawkorapin" --email=your@email.com

然后,只需用您的模块覆盖.pm文件,包括您想要运行的任何单元测试(默认测试基本上检查模块的语法以及pod语法)。 然后通过以下方式完成模块的基本安装

perl Makefile.PL
make
make test
make install

从技术上讲,make test 是可选的,但强烈建议使用。

现在,如果这些模块依赖于其他CPAN模块,那么您可以使用模块CPAN进行安装,例如:

use strict;
use warnings;
use CPAN;

#populate however you'd like, either hard-coded, read from a file, etc.
my @modules_to_install=(); 

foreach(@modules_to_install)
{
  CPAN::Shell->install($_);
}

所以,您可以使用 module-starter 开始的文件夹和文件(以及您修改的文件),以及上面的安装任何 CPAN 依赖项的脚本,分发一个 zip/tarball/etc,并将其称为 cpan_install.pl。如果您愿意,您可以再用一个叫做 install.pl 的最终脚本来包装所有这些功能。

可能,我在这里的主要问题是如何以及在哪里指定我的脚本位置?所有我的脚本都在<project>/bin下,我的.pm文件都在<project>/bin/lib下。 - Jessada Thutkawkorapin
2
对于每个模块(如果使用 --distro 选项,则还包括发行版),module-starter 都会包含 libt 目录,以及一些其他的样板文件,你大多数情况下可以忽略它们。一旦这些模块被安装(通过 perl Makefile.PL;make;make test;make install),它们就会被安装到你正在使用的任何 Perl 发行版的 site_perl 子目录中。 - user554546
9
对于使用CPAN自己安装缺失模块的操作,给予负评。相反,应该使用PREREQ_PM声明依赖项,这样它们将出现在发行版元数据文件中,还可以参见https://dev59.com/qGsz5IYBdhLWcg3wxq4V#7664993和https://dev59.com/hk3Sa4cB1Zd3GeqPsBJI#2606677中的示例。 - daxim

2
我的常规方法是从我现有的发行版中简单地复制一个Build.PL文件,然后开始进行。显然,这对于第一个发行版并不是一个有用的策略,但CPAN上有成千上万个这些文件。
对于一个简单的单.pm文件纯Perl发行版,最简单的方法可能是复制别人的Build.PL文件,并根据需要编辑字段。你可能只需要更改module_name和requires字段。
这是一个简单的示例,你可以参考:
use strict;
use warnings;

use Module::Build;

my $build = Module::Build->new(
   module_name => 'Your::Name::Here',
   requires => {
      'Your::Requirements::Here' => '1.23',
   },
   build_requires => {
      'Test::More' => 0,
   },
   license => 'perl',
   create_makefile_pl => 'traditional',
   create_license => 1,
   create_readme  => 1,
);

$build->create_build_script;

依次代表以下字段:

  • 安装包中主模块的名称 - 从中取得了安装包本身的名称、版本和摘要
  • 构建或运行此安装包时所依赖的其他模块
  • 构建此安装包时所依赖的其他模块,但一旦安装完成后将不再需要它们(通常是 Test:: 模块或其他构建工具)
  • 适用于此安装包的许可条款
  • 为老版 CPAN 客户端创建传统的 Makefile.PL 文件,以便理解 Build.PL 协议
  • 根据上述声明的许可条款自动创建一个 LICENSE 文件
  • 通过将主模块的 POD 文档转换为纯文本文件而自动生成 README 文件

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接