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

Posted

技术标签:

【中文标题】如何告诉 CPAN 安装所有依赖项?【英文标题】:How do I tell CPAN to install all dependencies? 【发布时间】:2010-10-28 06:43:16 【问题描述】:

我尝试在cpan中设置这些:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

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

有没有办法让它始终继续安装?我想让它无人看管。

似乎我想要一个标志来始终信任 CPAN 做正确的事情,如果它建议一个答案,我想遵循它(当它问什么时总是按 Enter)。

【问题讨论】:

也许我应该在我的 cpan 脚本中添加一个功能,以根据 CPAN.pm 设置设置自动安装环境变量。查看 tsee 的回答,这是问题的另一半。 【参考方案1】:

尝试像这样设置 PERL_MM_USE_DEFAULT:

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

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

【讨论】:

有什么办法让这个持久化,所以你可以每次在 cpan 中输入“install My:Module”,它会记住这个吗?编辑 Config.pm? 如果您使用的是 linux,请将行 export PERL_MM_USE_DEFAULT=1 添加到您的 ~/.bashrc 如果您收到错误Can't locate object method "install" via package "xxx" at -e line 1.,请在模块名称前添加一个“+”。【参考方案2】:

这个问题的最新最好的答案是改用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

【讨论】:

我在使用cpanm的时候遇到这个问题,所以告诉我使用它不是这里的解决方案。 而不是盲目评论,请在此处提出新问题并链接。我怀疑权限问题可能是您的问题 在我使用sudo apt install cpanminus make 安装的 Ubuntu 18.04 上。 投反对票。不建议人们执行 curl 的输出。 赞成。 “curl 的输出”是如何安装很多东西,从 k8s 到(在某些系统上)Docker。 curl 用于合法项目的上下文中,而不是运行 curl 输出的随机建议,但除此之外,在此处强加您的个人策略超出了范围。请注意,您始终可以将 curl 保存到磁盘,检查它然后运行它。【参考方案3】:

以下是使这些更改永久化的单行程序,包括自动首次 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一样吗?【参考方案4】:

在prerequisites_policy 之上更改以下参数。

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

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

【讨论】:

谢谢!我需要这两个选项,这样它就不会一次又一次地问我! 请注意,这些是这些设置的默认值。【参考方案5】:

我很确定您正在寻找以下内容:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

【讨论】:

【参考方案6】:

可能与使用ExtUtils::AutoInstall 或Module::AutoInstall 有关。尝试设置 PERL_AUTOINSTALL 环境变量。 (参见这些模块的文档。)

【讨论】:

【参考方案7】:

设置

prerequisites_policy

在配置中。

见Config Variables。

【讨论】:

提示是否与下载模块源有关?如果是这样,请参阅 connect_to_internet_ok 选项。否则,请告诉我们您要避免的其他提示。 基本上,最后这些是“可选模块”。 问题是自动安装的东西。 CPAN.pm 没有机会处理这些东西。请参阅 tsee 的回答。 链接现在似乎已失效【参考方案8】:

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

$ cpan
cpan> o conf init

这将启动CPAN.pm 接口配置实用程序。只需运行它并在需要的地方指定“跟随”(我忘记了这个问题),你应该很高兴。

【讨论】:

您可以将特定设置传递给init。例如,o conf init prerequisites_policy。这样,您不必经历漫长的初始化过程,但仍会收到有关设置的友好提示【参考方案9】:

我发现这是迄今为止安装 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”应该做什么?【参考方案10】:

我写这篇文章是为了帮助那些可能来到这个页面的人,他们正在寻找一种方法来安装特定 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,它将安装它。

【讨论】:

以上是关于如何告诉 CPAN 安装所有依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到我的 Perl 脚本的模块依赖项?

我可以重新测试所有已安装的 CPAN 模块吗?

安装 CPAN 模块时如何指定外部库文件位置

有没有办法让操作系统在 CPAN 发行版中定义依赖关系?

如何将 PyPi 依赖项添加到 DEB 包

如何检查已安装的 Ruby gem 的所有依赖项是不是满足?