如何自动化 CPAN 配置?

问题描述 投票:0回答:6

第一次从命令行运行 cpan 时,系统会提示您回答各种问题。如何从一开始就实现 cpan 自动化并以非交互方式安装模块?

perl cpan
6个回答
41
投票

由于尚未提及,cpanminus 是一个零配置的 cpan 安装程序。如果您的版本控制不可用,您可以下载独立的可执行文件。

cpanm 可执行文件可以轻松安装(如可执行文件本身中所述):

curl -L http://cpanmin.us | perl - --self-upgrade
# or
wget -O - http://cpanmin.us | perl - --self-upgrade

36
投票

我也在寻找一个简单的解决方案,发现这有效:

(echo y;echo o conf prerequisites_policy follow;echo o conf commit)|cpan

只是想我会把它发布在这里以防其他人出现。


8
投票

制作您自己的 CPAN.pm 配置文件。最新版本的

cpan
命令有一个
-J
开关用于转储当前配置,还有一个
-j
开关用于加载您喜欢的任何配置。

我添加这些开关是因为我们在 CD 上分发 CPAN,当时 MiniCPAN 的大小可以低于 700Mb。您可以正常运行

cpan
,但添加了一个选项:

% cpan -j /CD/Volume/path/cpan_config.pm ....

在该示例中,配置会将 URL 列表设置为 CD 路径。我早就丢失了源文件,但我记得有一种方法可以动态地找出它在哪里,或者可能有一个程序可以做到这一点并将配置保存在某处。


5
投票

CPAN.pm 的最新版本首先询问其余配置是否应自动运行,因此建议首先(手动)升级 CPAN.pm:tarballsrepo


4
投票

一种方法是获取从一个系统运行一次后创建的 CPAN/Config.pm (或 ~/.cpan/CPAN/MyConfig.pm),并将其安装为 ~/.cpan/CPAN/MyConfig.pm 在系统上你想要自动化。另一种方法是运行以下命令来为您创建 MyConfig.pm 文件(下面缺少的一件事是 urllist 参数的实际值,您必须为 CPAN 镜像填写适当的值):

#!/usr/bin/perl

use strict;
use Config;

$ENV{PERL_MM_USE_DEFAULT}=1;
$ENV{PERL_MM_NONINTERACTIVE}=1;
$ENV{AUTOMATED_TESTING}=1;

# get the path to the library
my $libpath = $Config{privlib};

# force CPAN::FirstTime to not default to manual
# setup, since initial CPAN setup needs to be automated
{
  local @ARGV = "$libpath/CPAN/FirstTime.pm";
  my @source = <>;
  $source[72] =~ s/\byes\b/no/ or die "Could not auto configure CPAN";
  eval join('', @source) or die "Error executing CPAN::FirstTime: $@";
}

CPAN::FirstTime::init("$libpath/CPAN/Config.pm");

delete $CPAN::Config->{links};
$CPAN::Config->{auto_commit} = '0';
$CPAN::Config->{check_sigs} = '0';
$CPAN::Config->{halt_on_failure} = '0';
$CPAN::Config->{make_install_make_command} = '/usr/bin/make';
$CPAN::Config->{mbuild_arg} = '';
$CPAN::Config->{mbuildpl_arg} = '';
$CPAN::Config->{mbuild_install_arg} = '';
$CPAN::Config->{show_upload_date} = '';
$CPAN::Config->{tar_verbosity} = '1';
$CPAN::Config->{trust_test_report_history} = '0';
$CPAN::Config->{use_sqlite} = '0';
$CPAN::Config->{yaml_load_code} = '0';
$CPAN::Config->{urllist}
  = [qw(http://... ftp://... etc...)];
$CPAN::Config->{connect_to_internet_ok} = '1';
$CPAN::Config->{perl5lib_verbosity}     = 'v';
$CPAN::Config->{prefer_installer}       = 'MB';
$CPAN::Config->{build_requires_install_policy} = 'no';
$CPAN::Config->{term_ornaments}         = '1';
$CPAN::Config->{mbuild_install_build_command} = './Build';

mkdir ".cpan/CPAN" or die "Can't create .cpan/CPAN: $!";
CPAN::Config->commit(".cpan/CPAN/MyConfig.pm");

CPAN::install('Bundle::CPAN');
CPAN::install('JSON');
CPAN::install('JSON::XS');
# etc.

exit 0;

0
投票

tl;博士

perl -mCPAN::FirstTime -e 'CPAN::FirstTime->init(autoconfig => 1)'

当您第一次运行

cpan
并开始询问问题时,堆栈跟踪如下:

/usr/bin/cpan
->
App::Cpan->run()

App::Cpan->run()
->
App::Cpan->_process_options()

App::Cpan->_process_options()
->
CPAN::shell()

CPAN::shell()
->
CPAN::HandleConfig->load()

CPAN::HandleConfig->load()
->
CPAN::FirstTime::init()

CPAN::FirstTime::init()
->
prompt()

CPAN::FirstTime::prompt()
->
_real_prompt()

CPAN::Shell::colorable_makemaker_prompt()
->
ExtUtils::MakeMaker::prompt()

ExtUtils::MakeMaker::prompt()
->
<STDIN>

因此,为了运行它需要一个配置,它在

CPAN/MyConfig.pm
CPAN
home
中查找该配置,通常位于
~/.cpan

创建配置的是

CPAN::FirstTime
模块。初始化
cpan
的一种方法是:

$ perl -mCPAN::FirstTime -e 'CPAN::FirstTime->init(autoconfig => 1)'
© www.soinside.com 2019 - 2024. All rights reserved.