如何使用CPAN.pm下载其他Perl模块?

时间:2009-01-20 23:53:27

标签: perl cpan

我是面向对象编程的新手,CPAN.pm上的perldoc页面让我感到困惑。我的程序需要下载几个模块(如果它们尚不存在)。这基本上只是:

CPAN::Shell->install("Module::Name::Here");

还是还有更多吗?是下载软件包,解压缩并安装它,还是仅仅执行其中一个或两个步骤?如果不是全部三个,我该如何做另一个(或两个)?我希望它确保它不会尝试重新安装任何东西,如果包已经存在 - 这是该函数的默认行为还是没有?

如何判断Perl是否无法连接到CPAN以获取程序包?

6 个答案:

答案 0 :(得分:7)

没有其他人提及它,但您必须首先加载CPAN配置:

use CPAN;

CPAN::HandleConfig->load;
CPAN::Shell::setup_output;
CPAN::Index->reload;

# now do your stuff

您还可以查看CPAN.pm附带的cpan(1)脚本,以查看许多程序员的界面。我还写了一篇关于最新一期The Perl Review的文章,其中展示了程序员与CPAN.pm接口的例子。

但是,您可能不需要执行任何操作。为什么你的程序自己下载模块?您是否尝试创建具有依赖关系的分发?有更好的方法来处理它,所以你不必重复已经在其他工具中完成的工作。例如,请参阅我的文章Creating Perl Application Distributions。您将程序看作是一个模块,并获得所有酷模块工具的好处,因此您无需重新发明内容。

如果您告诉我们更多关于您实际尝试解决的问题,我们也可能有其他好的答案。 :) 祝你好运,

答案 1 :(得分:6)

CPAN.pm上的perldoc页面让我感到困惑。

是的,CPAN API的文档仍然有点缺乏。并非每个人都为其他人的程序化使用而设计。如果你可以使用CPANPLUS,你可能会有更好的运气。

我的程序需要下载几个模块(如果它们尚不存在)。这基本上只是:CPAN :: Shell-> install(“Module :: Name :: Here”);

是的,这几乎是最简单的事情。事实上,当你输入“cpan Module :: Name :: Here”时,几乎所有'cpan'命令行程序都会这样做。但是,您需要事先配置CPAN.pm。

下载软件包,取消归档并安装吗?

是的,这三个。

我希望确保它不会尝试重新安装任何东西,如果包已经存在 - 这是该函数的默认行为还是没有?

是的,如果模块是最新的,默认行为是不安装任何东西。您可以使用“uptodate()”方法检查自己:

my $mod = CPAN::Shell->expand("Module", "Module::Name::Here");
$mod->install unless $mod->uptodate;

我怎么知道Perl是否无法连接到CPAN来获取包裹?

以编程方式很难以简单的方式解释。您需要查看输出,或者之后只需检查$ mod-> uptodate;

my $mod = CPAN::Shell->expand("Module", "Module::Name::Here");
if ( ! $mod->uptodate ) {
    $mod->install;
    die "Problems installing" unless $mod->uptodate;
}

祝你好运!

答案 2 :(得分:1)

基本上使用CPAN如下:

perl -MCPAN -e shell

如果这是您第一次运行它,它会询问您几个问题并将结果保存在配置文件中。

然后安装PGP :: Sign只需输入:

install PGP::Sign

然后你就定了。

关于你的上一个问题,不要担心,它会告诉你它是否可以连接。

答案 3 :(得分:1)

我过去曾尝试使用CPAN模块进行编程(相对较远的过去 - 比如5年前)没有太大的成功,所以我不再尝试了。当然,这意味着事情可能已经发生了变化。但是,CPAN这里的文档应该有所帮助。看起来很有希望的CPAN::API::HOWTO只有两个食谱,它们都与你的问题无关。您可能还会调查CPANPLUS是否更好 - 我以交互方式使用它的频率远远超过CPAN。两者都是令人难以置信的模块。

所以,正如@Keltia建议的那样,我会以交互方式进行CPAN(CPANPLUS)。

答案 4 :(得分:1)

正如您所知,我们大多数人只在交互模式下使用CPAN.pm,但是,您走在正确的轨道上。

我现在可以指出的事情:

  • 是的,调用CPAN :: Shell-> install()将下载,编译,测试和安装软件包。对于包具有的任何依赖项,它也应该以递归方式执行相同的操作。
  • 默认行为是不安装已安装的任何内容(除非有更新版本可用)。
  • 我并不完全确定错误处理的工作原理 - 我会调查一下,并报告回来。
  • 但它可能会提示您的用户。

答案 5 :(得分:-2)

凯尔提亚说得对。我将补充说,他的第一条指令是从命令提示符完成的,通常以root身份完成,但不一定如此。第二个命令是从CPAN提示符完成的。您也可以在命令行上完成所有操作,但我通常不这样做。

如果您使用的是Windows,最好的办法是使用PPM,但它的存储库大多数时候已经过时了。