4

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

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

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

我如何判断 Perl 是否无法连接到 CPAN 来获取软件包?

4

6 回答 6

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。你把你的程序当作一个模块来对待,并从所有很酷的模块工具中受益,这样你就不必重新发明一些东西。

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

于 2009-01-21T02:32:44.600 回答
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;
}

祝你好运!

于 2009-01-21T02:14:44.323 回答
1

基本上使用CPAN如下:

perl -MCPAN -e shell

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

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

install PGP::Sign

你已经准备好了。

至于你最后一个问题,别着急,它会告诉你能不能连接。

于 2009-01-20T23:58:25.033 回答
1

我在过去(相对遥远的过去——比如 5 年前)尝试使用 CPAN 模块以编程方式做事,但没有取得太大成功,所以我停止了尝试。当然,这意味着从那时起事情可能已经发生了变化。但是,此处有关CPAN的文档应该会有所帮助。看起来很有前途的CPAN::API::HOWTO只有两个配方,它们都与您的问题无关。您还可以调查 CPANPLUS 是否更好——我以交互方式使用它的频率比使用 CPAN 的频率高得多。两者都是令人难以置信的模块。

因此,正如@Keltia 建议的那样,我以交互方式执行 CPAN (CPANPLUS)。

于 2009-01-21T00:04:50.623 回答
1

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

我暂时可以指出的事情:

  • 是的,调用 CPAN::Shell->install() 将下载、编译、测试和安装一个包。它也应该递归地对包具有的任何依赖项执行相同的操作。
  • 默认行为是不安装任何已经安装的东西(除非有更新的版本可用)。
  • 我不确定错误处理是如何工作的——我会调查一下,然后报告。
  • 不过,它可能会提示您的用户。
于 2009-01-21T02:11:50.163 回答
-2

凯尔蒂亚说得对。我要补充一点,他的第一条指令是在命令提示符下完成的,通常是 root,但不一定如此。第二个命令是在 CPAN 提示符下完成的。您也可以在命令行上完成所有操作,但我通常不会。

如果您使用的是 Windows,最好的选择是使用 PPM,但它的存储库大多数时候都过时了,令人讨厌。

于 2009-01-21T00:08:44.093 回答