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

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

我尝试在cpan中设置这些:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

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

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

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

【问题讨论】:

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

标签: perl dependencies cpan


【解决方案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,它将安装它。

      【讨论】:

        猜你喜欢
        • 2010-12-14
        • 1970-01-01
        • 2020-05-30
        • 1970-01-01
        • 2012-12-19
        • 1970-01-01
        • 2014-01-02
        • 2011-01-13
        相关资源
        最近更新 更多