Perl 策略
本页面涵盖了 perl 本身如何配置和打包的策略。关于 Perl 模块打包指南,请参阅 Perl 软件包指南。
简介
本策略文档在 perl 软件包的 5.10.0 版本中被提出、接受和实施。它是关于 perl 软件包、相关的 Perl 软件包以及创建 Perl 模块软件包(二进制形式和 PKGBUILD 形式)的标准。部分内容来源于 Debian Perl 策略 文档以及 Perl 手册页的各个部分。
5.10 注意事项
不正确:脚本目录不符合文件系统层次结构标准 (FHS)。
/usr/bin
中必须有哪些目录,但并未禁止添加其他目录。理由
5.10.0 之前的 perl 打包约定中明显存在的问题包括
- 当前的 Arch Linux 默认 perl 安装将站点和供应商软件包安装到同一个目录树中,如果最终用户在站点软件包之上安装和升级 Arch Linux perl(供应商)软件包,则经常会导致冲突。
- 当前的 Arch Linux 默认 perl 安装将更新安装到 perl 核心模块的核心目录中,从而造成文件冲突。例如,模块如
Data::Dumper
和version
。 - 在
/usr/lib/perl5/
和/usr/lib/perl5/site_perl
中创建了一个符号链接农场,这是不必要且令人困惑的。 - 许多标准模块似乎缺失,或者在 perl 软件包本身中被忽略添加为 provides,这造成了困惑和 AUR 及仓库中的冗余条目,因为用户试图修复明显的模块缺失问题,而这些模块实际上由 perl 提供。这可能是一个教育问题。
- 当前的 perl 模块 PKGBUILD 可以得到相当程度的简化和标准化。
本策略将消除所有这些问题。
陷阱
采用类似本策略的当前(明显)缺点
- 更新每个 perl 模块 PKGBUILD,使其安装到正确的(供应商)目录树中。它在某种程度上仍然向后兼容旧结构,因为旧的 PKGBUILD 在技术上仍然可以工作。
- 在 core 仓库中引入了对 perl 软件包的更改,并提出了一个新的 perl-modules 软件包,该软件包将位于 extra 仓库中。
- 在遵循本文档的 Arch Linux PC 上重新编译之前,编译 perl 解释器静态副本的非 perl 软件包将无法正常运行。此类软件包的示例包括 vim、subversion 和 irssi。存在许多这样的示例。
Perl 版本
在任何给定时间,perl 软件包应代表 Perl revision 5 的当前稳定上游版本。(参见 Perl 6)。
只能有一个软件包包含 /usr/bin/perl
二进制文件,并且该软件包必须是 perl 或该软件包的依赖项。为了提供 Perl 的最小安装,供应用程序使用而无需安装整个 Perl,perl 软件包包含二进制文件和一组基本模块。perl 软件包应为其基本 perl 软件包提供的每个模块声明 provide 语句。
模块路径
Perl 搜索三个不同的位置来查找模块,本文档中将其称为 core(其中安装了 Perl 发行版附带的模块)、vendor(用于打包模块)和 site(用于本地管理员安装的模块)。
Arch Linux 软件包中的模块搜索路径 (@INC
) 已被排序,以按以下顺序包含这些位置
- 站点
本地管理员为当前 Perl 版本安装的模块。通常,这些模块使用 cpan 或 cpanp 工具安装,或者以源代码形式下载并通过 make 安装。
/usr/lib/perl5/site_perl/version
/usr/share/perl5/site_perl/version
- 供应商
打包模块,通过 pacman 工具从 core 或 extra 仓库安装,或从 ABS/AUR PKGBUILD 构建成适当的 Arch Linux 软件包。
/usr/lib/perl5/vendor_perl
/usr/share/perl5/vendor_perl
- 核心
包含在核心 Perl 发行版中的模块。
/usr/lib/perl5/core_perl
/usr/share/perl5/core_perl
- 已过时
过时是本文档建立之前安装的模块的路径名。这些路径已从 perl 5.12.2 中的 @INC 中删除。
/usr/lib/perl5/site_perl/current/arch
/usr/lib/perl5/site_perl/current
/usr/lib/perl5/current
在上面的每对目录中,lib
组件用于二进制、架构相关的 (XS) 模块,share
用于架构无关的(纯 perl)模块。在任何情况下都不应使用 current
作为 version
的替代品。核心和供应商模块应与当前安装的 perl 相匹配。
文档
不引用程序的 POD 文件、手册页和 HTML 文档可以从软件包中剥离,这对于大多数 Arch Linux 软件包来说是正常的。这是可选的。
Perl 软件包附带的手册页必须安装到标准目录中
- 程序
- 程序和脚本的手册页安装到
/usr/man/man1
中,扩展名为.1perl
。 - 模块
- 模块的手册页安装到
/usr/man/man3
中,扩展名为.3perl
。
二进制文件和脚本
为了防止文件冲突,保持由 core、vendor 和 site 安装生成的二进制文件分离非常重要。同样重要的是,每个用户配置文件中设置的默认 PATH
环境变量应按照与 perl 的 @INC
路径相同的顺序搜索二进制文件。为了实现这一点,二进制文件应安装到以下目录中
- 核心
- 所有 core 软件包的二进制文件和脚本应安装到
/usr/bin/core_perl
中。 - 供应商
- 所有 vendor 软件包的二进制文件和脚本应安装到
/usr/bin/vendor_perl
中。 - 站点
- 所有 site 的二进制文件和脚本应默认安装到
/usr/bin/site_perl
中。
perl
软件包应包含一种机制,用于相应地调整最终用户的 PATH
条目,以便按照以下顺序搜索 perl 二进制文件:site、vendor、core。
核心
核心模块是“通常”包含在核心 Perl 发行版中的 Perl 模块。
核心目录
- 核心 Perl 发行版中包含的模块应安装到
/usr/lib/perl5
和/usr/share/perl5
中。 - 只有 perl 软件包中包含的模块才应安装到此目录树中。
- 这些路径中不存在版本子目录,因为打包模块的依赖关系应确保所有模块都与当前的 perl 软件包一起工作。
核心 perl 软件包
perl 软件包应包含 /usr/bin/perl
二进制文件,以及运行简单 perl 脚本和基本系统运行所需的最少模块集。它应在 core 仓库中维护。
以下是 perl 软件包中提供的一些模块列表(例如)。(请参阅 PKGBUILD 获取官方列表)。
'perl-checktree' 'perl-collate' 'perl-config' 'perl-cwd' 'perl-dynaloader' 'perl-english' 'perl-env' 'perl-exporter' 'perl-fnctl' 'perl-filehandle' 'perl-find' 'perl-finddepth' 'perl-getopt' 'perl-makemaker' 'perl-socket' 'perl-sys-syslog' 'perl-db-file' 'perl-storable' 'perl-data-dumper' 'perl-digest-md5'
.
perl 软件包中提供的每个模块都应添加到 PKGBUILD 中的 provides
数组中。此数组中的模块不应出现在 perl 软件包的 conflicts
或 replaces
数组中。最终用户应该能够在 vendor 或 site 目录中安装较新版本的核心模块,而不会发生文件冲突。
站点
站点模块是由本地管理员为当前 Perl 版本安装的 perl 模块。通常,这些模块使用 cpan 工具安装,或者以源代码形式下载并通过 make(或 MakeMaker)安装。
站点目录
Perl 软件包必须为本地管理员提供一种机制,以便在 /usr/lib/perl5/site_perl
下安装模块,但不得创建或删除这些目录。
模块应安装到模块路径 site
中描述的目录,程序安装到 /usr/bin/site_perl
,手册页安装到 /usr/man
下。
站点安装
在大多数情况下,以下命令对于本地管理员安装模块应该足够,并且必须根据需要创建目录
perl Makefile.PL make install
或
cpan Foo::Bar
供应商
供应商模块是打包模块,通过 pacman 工具安装,或已从 PKGBUILD 和 makepkg 构建到适当的 Arch Linux 软件包中的模块。
软件包命名
Perl 模块软件包应以提供的主要模块命名。模块 Foo::Bar 的命名约定是 perl-foo-bar。包含多个模块的软件包还可以使用相同的约定为这些模块添加 provides。
供应商目录
Arch Linux 模块的安装目录必须与 site
模块的安装目录不同。一些指南包括
- 当前的 Perl 打包为此目的使用了 vendor 目录,目前如上面
vendor
中所述。 - 这些目录中不存在版本子目录,因为打包模块的依赖关系应确保所有模块都与当前的 perl 软件包一起工作。
- Perl 发行版包含许多可从 CPAN 单独获得的模块,这些模块可能具有更新的版本。
@INC
排序(如上所述)的目的是允许将此类模块打包到 vendor,使其优先于 core 中的版本。以这种方式遮蔽 core 模块的打包模块必须是较新的版本。 - 模块软件包必须使用扩展名
.1p
和.3pm
将手册页安装到标准目录中,以确保在打包模块复制 core 模块时不会发生冲突。 - 不应安装
.packlist
(用于模块卸载)和perllocal.pod
(用于记录本地/站点安装)文件,如果找到,则应从软件包中删除。 - 应修剪空目录。
供应商安装
模块应在 PKGBUILD 构建目标中使用以下行。
perl Makefile.PL INSTALLDIRS=vendor
这一行将结果安装到临时树中...
make install DESTDIR="${pkgdir}" install
为了确保模块正确安装到新的 @INC
路径中,需要依赖于 perl (>= 5.10.0)。
供应商 PKGBUILD 示例
# $Id$ # Contributor: Barry User <barry@user.com> # Maintainer: Harry Hacker <harry@hacker.com> pkgname=perl-html-template _realname=HTML-Template pkgver=2.9 pkgrel=2 pkgdesc="Perl/CPAN Module HTML::Template : a simple HTML templating system" arch=('any') url="https://search.cpan.org/dist/${_realname}/" license=('GPL' 'Artistic') depends=('perl>=5.10.0') source=("https://www.cpan.org/authors/id/S/SA/SAMTREGAR/${_realname}-${pkgver}.tar.gz") md5sums=("cbf88a486b36284be55765ac7357c187") options=('!emptydirs') build() { cd "${_realname}-${pkgver}" # Setting these env variables overwrites any command-line options we don't want... export PERL_MM_USE_DEFAULT=1 PERL_AUTOINSTALL=--skipdeps \ PERL_MM_OPT="INSTALLDIRS=vendor DESTDIR='$pkgdir'" \ PERL_MB_OPT="--installdirs vendor --destdir '$pkgdir'" \ PERL5LIB="" PERL_LOCAL_LIB_ROOT="" \ MODULEBUILDRC=/dev/null # If using Makefile.PL { /usr/bin/perl Makefile.PL && make && make test && make install; } || return 1 # If using Build.PL { /usr/bin/perl Build.PL && ./Build && ./Build test && ./Build install; } || return 1 # remove perllocal.pod and .packlist find "$pkgdir" \( -name .packlist -o -name perllocal.pod \) -delete }
依赖关系
二进制模块
二进制模块必须指定对 perl
的依赖关系,最低版本为用于构建模块的 perl
软件包的版本,并且还必须依赖于使用 Config
模块扩展的 perlapi-$Config{version}
。
架构无关模块
需要 perl
软件包中的 core 模块的架构无关模块必须指定对该软件包的依赖关系。
包含显式 require version
或 use version
语句的模块必须指定对 perl
的依赖关系,最低要求版本或更简单地说,当前版本。
在没有明确要求的情况下,由于该版本引入的 @INC
更改,架构无关模块必须依赖于最低 perl
版本 5.10.0
。
Perl6
下一个主要修订版本的工作目前正在进行中,尽管规范尚未最终确定。
预计当 Perl 6 发布时,最初将打包为 perl6,将二进制文件安装为 /usr/bin/perl6
,并为打包模块使用与 perl 不同的目录
/usr/lib/perl6
/usr/share/perl6
这将允许 Perl 5 和 6 软件包和模块(应打包为 perl6-foo-bar)共存尽可能长的时间。
在未来的某个阶段,当 Perl 6 足够成熟时,软件包命名可能会颠倒,使得 perl
软件包包含 Perl 6,而当前的软件包变为 perl5
。