Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何告诉CPAN安装所有依赖项?_Perl_Dependencies_Cpan - Fatal编程技术网

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

Perl 如何告诉CPAN安装所有依赖项?,perl,dependencies,cpan,Perl,Dependencies,Cpan,如何告诉CPAN安装所有依赖项 我尝试在cpan中设置这些: cpan> o conf prerequisites_policy follow cpan> o conf commit 我仍然要回答“y”几次(但感觉比以前少了) 有没有办法让它一直进行安装?我想让它无人看管 似乎我希望有一个标志始终信任CPAN做正确的事情,如果它给出了一个答案,我愿意遵循它(当它提出问题时总是按Enter键)。设置 prerequisites_policy 在配置中 请参阅。可能与此相关或正在使用

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

我尝试在
cpan
中设置这些:

cpan> o conf prerequisites_policy follow
cpan> o conf commit
我仍然要回答“y”几次(但感觉比以前少了)

有没有办法让它一直进行安装?我想让它无人看管

似乎我希望有一个标志始终信任CPAN做正确的事情,如果它给出了一个答案,我愿意遵循它(当它提出问题时总是按Enter键)。

设置

prerequisites_policy
在配置中


请参阅。

可能与此相关或正在使用。尝试设置PERL_AUTOINSTALL环境变量。(请参阅这些模块的文档。)

我个人只尝试过几次以这种方式修改设置,实际上,我发现通过不给
CPAN
参数,然后从交互提示配置
CPAN.pm
可以更容易地进入
CPAN.pm
shell:

$ cpan
cpan> o conf init

这将启动
CPAN.pm
接口配置实用程序。只需运行它并在需要的地方指定“follow”(我马上就忘了这个问题),您就可以开始了。

尝试设置PERL\u MM\u USE\u默认值,如下所示:

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

它应该使CPAN对所有提示都进行默认应答。

以下是我非常确定您要查找的内容:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

在先决条件上更改以下参数将遵循以下策略

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

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

此问题的最新和最好答案是改用(也称为App::cpanminus或cpanminus)

描述

cpanminus是一个脚本,用于从中获取、解包、构建和安装模块 CPAN不做任何其他事情

它是无依赖性的(可以引导) 本身),需要零配置,并且是独立的。跑步的时候,, 它只需要10MB的RAM

要启动并安装它,请执行以下操作:

curl -L http://cpanmin.us | perl - --sudo App::cpanminus
或者,如果您只是使用

或来自cpan本身:

cpan install App::cpanminus
从那时起,通过执行(如有必要,以root用户身份)安装模块


以下是使这些更改永久化的一个衬里,包括自动首次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外壳或其他任何东西之前运行它。

我发现这是迄今为止安装CPAN模块最快捷、最可靠的方法:

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

我写这篇文章的目的是为了帮助那些可能已经来到本页的人,他们正在寻找一种方法来安装特定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";
    }
    }
}
#/usr/bin/perl
`sudo apt安装cpanminus`;
而(){
如果(/USE/i)
{
我的$line=$\ux;
$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/;
除非($line eq''){
我的$cmd='sudo cpanm'.$行;
打印“安装$line\n”;
打开我的$cmd|fh,“$cmd|”;
而(){
打印“$”;
}
关闭$cmd_fh;
打印“\n”;
}
}
}


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

这些提示是否与下载模块源相关?如果是,请参阅“连接到internet”确定选项。否则,请告诉我们您正试图避免的其他提示。基本上,最后这些提示都是正确的“可选模块"。问题是自动安装的东西本身。CPAN.pm没有机会处理这些东西。请参阅tsee的答案。链接现在似乎已失效。也许我应该在我的CPAN脚本中添加一个功能,以根据CPAN.pm设置设置自动安装环境变量。请参阅tsee的答案,这是问题的另一半。有什么方法使这是持久性的,因此您每次只需在cpan中键入“install My:Module”,它就会记住这一点?Edit Config.pm?如果您在linux上,请将行
export PERL\u MM\u USE\u DEFAULT=1
添加到~/.bashrcIf您的~/.bashrcIf出现错误
无法通过包“xxx”在-e第1行找到对象方法“install”。
添加“+”就在模块名称之前。我在使用
cpanm
时遇到了这个问题,因此告诉我使用它并不是这里的解决方案。与其说是一个盲目的评论,不如说是一个新问题并在这里链接。我怀疑权限问题可能是你的问题。我安装了一个Ubuntu 18.04,附带
sudo apt install cpanminus make
。向下投票。D我不建议人们执行curl.Up-voting的输出。“curl的输出”是如何安装很多东西,从k8s到(在某些系统上)Docker。curl用于合法项目的上下文中,不是运行curl输出的随机建议,但除此之外,在此处强制实施您的个人策略超出了范围。请注意,您始终可以将curl保存到磁盘,检查它,然后运行它。这并不能回答问题-OP需要一种自动安装依赖项/自动安装的方法ly响应提示。事实上,它确实安装了依赖项并自动响应提示。我一直在使用它,包括现在。但是需要做一个小的修改:
yes |/root/bin/perl-MCPAN-e“CPAN::Shell->notest(qw!安装::模块!)”
什么是“
yes
”应该这样做吗?这和@sdf anwer中的不一样吗?谢谢!我需要这两个选项,这样它就不会一次又一次地问我了!请注意,这些是这些设置的默认值。您可以将特定设置传递给
init
。例如,
o conf init premissions\u policy
。这样,您就不必经历漫长的初始化过程序列化过程,但仍会得到有关设置的友好提示
yes | perl -MCPAN -e "CPAN::Shell->notest(qw!install Your::Module!)"
#!/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";
    }
    }
}