如何告诉 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 安装所有依赖项?的主要内容,如果未能解决你的问题,请参考以下文章