如何告诉CPAN安装所有依赖项?


113

如何告诉CPAN安装所有依赖项?

我尝试将这些设置为cpan

cpan> o conf prerequisites_policy follow
cpan> o conf commit

我仍然不得不回答“ y”两次(但比以前感觉要少)。

有没有办法让它总是继续安装?我想让它无人值守。

似乎我想让一个标志始终信任CPAN做正确的事,如果它建议一个答案,我想跟随它(总是Enter在询问问题时点击)。


1
也许我应该在cpan脚本中添加一个功能,以基于CPAN.pm设置来设置自动安装环境变量。请参阅tsee的答案,这是问题的另一半。
布赖恩·德·福伊

Answers:


30

这是使这些更改永久生效的唯一方法,包括自动首次CPAN配置:

perl -MCPAN -e 'my $c = "CPAN::HandleConfig"; $c->load(doit => 1, autoconfig => 1); $c->edit(prerequisites_policy => "follow"); $c->edit(build_requires_install_policy => "yes"); $c->commit'

或将其与local::lib非特权用户的模块结合使用:

perl -MCPAN -Mlocal::lib=~/perl5 -e 'my $c = "CPAN::HandleConfig"; $c->load(doit => 1, autoconfig => 1); $c->edit(prerequisites_policy => "follow"); $c->edit(build_requires_install_policy => "yes"); $c->commit'

在使用CPAN Shell或其他工具之前,先运行它。


和@sdf anwer中的一样吗?
filimonov

83

尝试像这样设置PERL_MM_USE_DEFAULT:

PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install My::Module'

它应该使CPAN回答所有提示的默认设置。


有什么方法可以使它持久化,因此您只需每次在cpan中键入“ install My:Module”,它就会记住这一点吗?编辑Config.pm吗?
杰夫2012年

3
如果您使用的是Linux,则将该行添加export PERL_MM_USE_DEFAULT=1到〜/ .bashrc
andersand,2012年

1
如果出现错误Can't locate object method "install" via package "xxx" at -e line 1.,请在模块名称前添加“ +”。
Yann Sagon 2014年

55

这个问题的最新最大答案是使用cpanm(也称为App :: cpanminus或cpanminus)!

描述

cpanminus是一个脚本,用于从CPAN获取,解压缩,构建和安装模块,并且不执行其他任何操作。

它没有依赖项(可以自行引导),需要零配置,并且独立存在。运行时,它仅需要10MB的RAM。

要引导安装它:

curl -L http://cpanmin.us | perl - --sudo App::cpanminus

或者如果您perlbrew只是简单地使用

perlbrew install-cpanm

或从cpan本身:

cpan install App::cpanminus

从那时开始,通过执行安装模块(如果需要,以root用户身份)

cpanm Foo::Bar

1
我在使用时遇到此问题cpanm,因此告诉我使用它不是这里的解决方案。
reinierpost

3
而不是盲目评论,请提出新问题并在此处链接。我怀疑权限问题可能是您遇到的问题
Joel Berger

在Ubuntu 18.04上,我使用进行了安装sudo apt install cpanminus make
Pablo A

不赞成投票。不建议人们执行curl的输出。
理查德·史密斯

28

这是我确定要寻找的东西:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

27

接下来是在prerequisites_policy顶部更改以下参数。

cpan> o conf prerequisites_policy 'follow'
cpan> o conf build_requires_install_policy yes
cpan> o conf commit

这会将其从“询问/是”更改为“是”,并停止它询问您。


谢谢!我需要这两个选项,这样它才不会一次又一次地问我!
DTT TT

请注意,这些是这些设置的默认值。
ikegami


6

prerequisites_policy

在配置中。

请参阅配置变量


2
提示是否与下载模块源有关?如果是这样,请参阅connect_to_internet_ok选项。否则,请告诉我们您要避免的其他提示。
锡南·努尔

好吧,基本上所有这些最后一个都是“可选模块”。
尼夫尔

问题是它们自己自动安装。CPAN.pm没有机会处理这些东西。请参阅tsee的答案。
布赖恩·杜伊

1
链接现在似乎已失效
OrangeDog

3

就我个人而言,我仅尝试过几次以这种方式修改设置,并且实际上发现CPAN.pm通过不提供cpan任何参数然后CPAN.pm从交互式提示进行配置,可以更轻松地进入外壳:

$ cpan
cpan> o conf init

这将启动CPAN.pm接口配置实用程序。只需运行它,然后在需要的地方指定“关注”即可(我忘了这个问题),您应该一切顺利。


您可以将特定设置传递给init。例如,o conf init prerequisites_policy。这样,您不必经历冗长的初始化过程,但仍会得到有关设置的友好提示
ikegami

3

我发现,到目前为止,这是安装CPAN模块的最快,最可靠的方法:

yes | perl -MCPAN -e "CPAN::Shell->notest(qw!install Your::Module!)"

这不能回答问题-OP需要一种自动安装依赖项/自动响应提示的方法。
威廉·特雷尔

实际上,它确实安装了依赖项并自动响应提示。我一直在使用它,包括这一刻。但是需要进行一些小的修改: yes|/root/bin/perl -MCPAN -e "CPAN::Shell->notest(qw!install Your::Module!)"
弗拉基米尔·马尔琴科

什么是“ yes”该怎么办?
彼得·莫滕森

2

我写这篇文章是为了使那些可能已经来此页面寻求安装特定perl脚本所需的所有模块依赖关系的人的人们受益。我为此编写了一个脚本:

它应该以 ./installdep.pl yourscript.pl

#!/usr/bin/perl
`sudo apt install cpanminus`;
while (<>) {
    if (/USE /i)
    {
        my $line=$_;
        $line=~ s/\s//g;
        $line=~ /^(.*)\./;
        $line=~ s/\;//;
        $line=~s/^USE//i;
        $line=~s/lib.*//i;
        $line=~s/feature.*//i;
        $line=~s/strict//i;
        $line=~s/warnings//i;
        $line =~ s/^(.*)\(.*/$1/;
        unless ($line eq '') {
        my $cmd='sudo cpanm '.$line;
        print "Installing $line \n";
        open my $cmd_fh, "$cmd |";
        while (<$cmd_fh>) {
          print "$_";
        }
        close $cmd_fh;
        print "\n";
    }
    }
}

这将使用cpanminus安装脚本所需的所有模块依赖项。如果未安装cpanm,它将进行安装。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.