CPAN PLUS
场景:一个炎热的八月,阿姆斯特丹某处。在一家名为“又一酒店”的酒吧里,聚集了很多人。从他们的着装来看,他们不是来这里做生意的——至少不是卖吸尘器的生意。他们注意到阳光,并欣赏它,但真正吸引他们的却是他们笔记本电脑的明亮光芒。
一个长着黑长发的男子站了起来——他看起来是这群不寻常集会中的领导者。他穿着工作服,赤脚。
他开始谈论一种被称为“see pants”的东西,它有可能改变笔记本电脑人的世界。它将改变免费软件的发行方式。它将获得质量标志;它将被测试和审查。而且,天啊,它将变得很好。
那个人是Michael Schwern。他的想法是CPANTS,即“CPAN测试服务”,而场合是2001年的YAPC::Europe。但是CPANTS需要工作。我们每个人都带着自己的小部分出发,试图让世界变得更好。
作为一个Perl社区的新手,我渴望一个挑战性的项目,我提出修补CPAN.pm
,这样CPANTS就可以自动构建模块并测试它们。我想象这会是一个简单的角色。
我开始查看CPAN.pm
的源代码。尽管在我的用户经验中,CPAN.pm
总是像广告中所说的那样工作,但作为一个开发者,我面临着它的局限性:它并不十分模块化,允许很少的功能扩展;它的编程接口有限,基本上是为交互式使用设计的。
所以我站在那里,承诺要改善CPAN接口,但缺乏相应的代码库,有两个选择:抱怨或修复。既然抱怨不会得到预期的结果,唯一剩下的选择就是从头开始。
于是CPANPLUS诞生了。它的目标很简单:做CPAN.pm
所做的,但做得更好。我们将从一个干净的代码库开始,该代码库旨在适应不同类型的用途。但与此同时,这个代码应该是起点,而不是终点。
那么CPANPLUS更好吗?这由你决定。该项目始于2001年10月,2002年3月底在CPAN上发布了第一个官方版本,与这篇文章同时推出。
设置CPANPLUS
设置CPANPLUS应该是简单的。它就像安装其他Perl模块一样安装。
perl Makefile.PL
make
make test
make install
使用“perl Makefile.PL”设置CPANPLUS。在此阶段,CPANPLUS将尝试做两件事
- 为您的系统写入适当的配置;
- 探测CPANPLUS希望拥有的但不是必需的模块。
目前,配置不是自动的,所以您将需要回答一些关于您系统的问题,尽管在许多情况下默认值是可以接受的。然后CPANPLUS将第一次获取索引文件,并要求您选择您最喜欢的CPAN镜像。您可以从列表中选择,或指定自己的。
一个问题仍然存在:我们应该探测缺失的模块吗?建议您这样做,因为安装了这些模块后,CPANPLUS会更快、更好。但这是您的选择:CPANPLUS不需要任何非核心模块来运行。
继续使用make
和make test
。所有测试都应该通过——如果它们没有通过,那么有问题。测试平台列表可在CPANPLUS常见问题解答网站找到。最后,运行“make install”,CPANPLUS将安装在您的系统上!
CPANPLUS的结构
如您所注意到的,如果您查看过源代码,CPANPLUS分布在许多模块中。这是因为大量的子类化:我们相信每个特定任务应该在CPANPLUS库中拥有自己的空间。这种模块化构建允许扩展库和许多插件。
有两个模块对CPANPLUS用户特别有吸引力。一个是用户界面CPANPLUS::Shell
,另一个是编程接口CPANPLUS::Backend
。这两个模块将在后面进行更深入的讲解。另外两个模块允许您在运行时更改库的行为。这些是CPANPLUS::Error
,允许您操纵CPANPLUS的输入输出错误信息;以及CPANPLUS::Configure
,允许您在运行时更改配置。如果您是CPANPLUS的开发者,它们绝对值得一看。
用户界面:'Shell
'
实际上,说“Shell”是唯一的用户界面并不公平;CPANPLUS被设计成可以与任意数量的shell一起工作。事实上,如果您想编写自己的shell,那也是可能的。目前,只有默认的shell存在,但Jouke Visser正在开发一个wxPerl
shell。
您可以在配置文件中指定您希望运行的shell。默认的是CPANPLUS::Shell::Default
。
有两种方式可以调用shell。一种是熟悉的方式
perl -MCPANPLUS -eshell
您的Perl bin目录中也有一个可执行文件
cpanp
-M
语法也接受一些标志,允许您从命令行安装模块。有关CPANPLUS的详细信息,请参阅perldoc。
现在让我们看看如何使用默认的shell。
它的一项特性是每个命令都使用单个字母。这可以被称为“紧凑型shell”,因为它设计得小巧,但仍提供您需要的所有基本命令。
以下是可用命令选项的简要总结,您也可以在shell提示符下键入“h”或“?”查看
a AUTHOR [ AUTHOR] Search by author or authors
m MODULE [ MODULE] Search by module or modules
i MODULE | NUMBER Install a module by name or previous result
d MODULE | NUMBER Download a module to the current directory
l MODULE [ MODULE] Display detailed information about a module
e DIR [ DIR] Add directories to your @INC
f AUTHOR [ AUTHOR] List all distributions by an author
s OPTION VALUE Set configuration options for this session
p [ FILE] Print the error stack (optionally to a file)
h | ? Display help
q Exit the shell
让我们假设您想查看是否可以在Acme::
命名空间中安装模块。
首先,您需要使用模块搜索来查找符合您标准的模块
m ^acme:
如您所见,搜索可以使用正则表达式。这是默认shell的一个特性,所有搜索都是不区分大小写的。
此搜索将返回类似的结果
0001 Acme::Bleach 1.12 DCONWAY
0002 Acme::Buffy undef LBROCARD
0003 Acme::Colour 0.16 LBROCARD
0004 Acme::ComeFrom 0.05 AUTRIJUS
0005 Acme::DWIM 1.05 DCONWAY
第一个数字是这个搜索的ID,可以用作后续命令的快捷方式。下一列是模块名称,然后是版本号。最后是作者的CPAN ID。
假设您想了解更多关于Acme::Buffy
的信息。只需键入
l Acme::Buffy
或者,为了节省力气,可以使用最近搜索的ID
l 2
这将给出类似的结果
Details for Acme::Buffy:
Description An encoding scheme for Buffy fans
Development Stage Released
Interface Style hybrid, object and function interfaces available
Language Used Perl-only, no compiler needed, should be platform independent
Package Acme-Buffy-1.2.tar.gz
Support Level Developer
Version undef
如果“Acme::Buffy”看起来很有吸引力,那么您可以安装它
i 2
这就是您需要使用CPANPLUS安装模块的全部内容。
程序员接口:'Backend
'
CPANPLUS shell建立在CPANPLUS::Backend模块之上。Backend提供了用于模块管理任务的通用函数。它不仅适用于创建shell,还适用于创建独立程序。
而不是详细描述所有可用的方法(这些方法在CPANPLUS::Backend pod中有文档),我将给出一些示例代码,以展示您可以使用Backend做什么。
### Install all modules in the POE:: namespace ###
my $cb = new CPANPLUS::Backend;
my $hr = $cb->search( type => 'module', list => [qw|^POE$ ^POE::.*|] );
my $rv = $cb->install( modules => [ keys %$hr ] );
变量$rv
是一个哈希引用,键是模块名称,值是退出状态。这允许您检查每个模块的安装情况。您还可以从Backend
获取一个错误对象,它记录了CPANPLUS在安装这些模块期间所做的所有操作。
### Fetch a certain version of LWP ###
my $cb = new CPANPLUS::Backend;
my $rv = $cb->fetch( modules => ['/G/GA/GAAS/libwww-perl-5.62.tar.gz'] );
再次强调,$rv
是一个哈希引用,键是您尝试获取的模块,值是它在您的磁盘上的存储位置。有些人可能不喜欢处理搜索的方式,而愿意自己编写。Backend
允许您自己动手处理这些事情。
### Do your own thing ###
my $cb = new CPANPLUS::Backend;
my $mt = $cb->module_tree();
$mt
现在包含了完整的模块树,这与 CPANPLUS 内部使用的树相同。对于这个哈希引用,键是模块名称,值是 CPANPLUS::Internals::Module
对象。
for my $name ( keys %$mt ) {
if ($name =~ /^Acme/) {
my $href = $mt->{$name}->modules();
while ( my ($mod,$obj) = each %$href ) {
print $obj->install()
? "$mod installed succesfully\n"
: "$mod installation failed!\n";
}
}
}
这会遍历模块树,寻找匹配正则表达式 '/^Acme/'
的模块名称,并安装所有由同一作者创建的模块。
你为什么要这样做?我们都有自己的理由,我的理由是 Acme::
命名空间是 CPAN 的前沿代码库。那里的模块作者必须值得信赖!
接口的优点
除了我提到的模块之外,还有很多其他的模块:CPANPLUS 目前包含 17 个模块。这些模块是三层方法的一部分。在所有内容下方是 Internals
,它执行琐碎的工作;Backend
在其上方;最后是 Shell
,它提供用户界面。
分层结构背后的逻辑是,每个人都希望从 CPANPLUS 获得不同的东西。有些人只想有一个像 CPAN.pm
提供的运行时 shell。其他人需要一种编写管理 Perl 安装的应用程序的方法。还有一些人梦想着更复杂的插件,比如 CPANTS 或与 RT 的自动错误报告——这些都是已经计划好的。
这种划分使我们能够保持灵活性。CPANPLUS 里有每个人的东西——如果目前还没有,也许可以在现有的代码库上构建。
当前和未来的发展
CPANPLUS 刚刚发布,但我们并没有休息。我们还想提供很多功能。
创建与当前 CPAN.pm
的向后兼容性是当务之急,这样 CPANPLUS 最终可以发布为 CPAN.pm
,可能取代其在核心 Perl 分发中的位置。
另一个已经提到的发展是自动错误报告,这将向模块作者提供有关其模块在不同平台和不同配置下的性能反馈。当然,还有 CPANTS,这是激发整个 CPANPLUS 项目的想法。CPANTS 的目的是对 CPAN 模块进行自动化测试,以确保它们满足最低标准。
我们考虑与已知的包管理器如 PPM
、RPM
和 dpkg
集成。
我们还计划开发更多 shell,包括命令行和 Windows 以及 X 环境。
自然,我们不想就此停止。CPANPLUS 有无限的可能,希望它们都能被探索和开发。
如果你有一个好主意,请通过电子邮件发送你的建议;或者最好是加入我们作为开发者并贡献!
支持和贡献
如果你有疑问或建议,或者想加入作为开发者,请发送电子邮件到:[email protected]。这是通用邮件列表。
错误报告应发送到:[email protected] 一些开发者也是 magnet 上 #CP 频道的常客。
获取 CPANPLUS 的地方
你可以在两个地方获得 CPANPLUS。第一个当然是你当地的 CPAN 镜像(或在 search.mcpan.org 上查找)。最新的稳定版本始终在那里。
如果你对开发版本感兴趣,请查看 GitHub。
更多信息
除了 CPANPLUS 伴随的文档外,我们网站上还有信息:Web site。所有的好东西都从这里开始。
顺便说一句,我将在 YAPC::America::North 和 YAPC::Europe 以及 TPC 上发表关于 CPANPLUS 的演讲和教程。来分享你的想法吧!
致谢
当然,我无法在结束之前不对其他开发者表示感谢。虽然我是CPANPLUS的发起者,但没有Joshua Boschert和Autrijus Tang,它绝不可能成为现在这个样子。Ann Barcomb编写了所有文档,Michael Schwern提供了测试和一些很好的想法。还要感谢所有为开发邮件列表和错误报告邮件列表做出贡献的人。
结论
所以,八个月前那次神奇聚会之后,我们又迈出一步,更接近目标。又一步接近“另一个场所”。也许在那里,我会站起来,谈论新事物,至少是CPANPLUS。
希望我能在那里见到你们,在笔记本电脑的圈子中,我们一起继续让我们的世界变得更好!
标签
反馈
这篇文章有什么问题吗?请通过在GitHub上打开问题或拉取请求来帮助我们。