第一次从命令行运行 cpan 时,系统会提示您回答各种问题。如何从一开始就实现 cpan 自动化并以非交互方式安装模块?
由于尚未提及,cpanminus 是一个零配置的 cpan 安装程序。如果您的版本控制不可用,您可以下载独立的可执行文件。
cpanm 可执行文件可以轻松安装(如可执行文件本身中所述):
curl -L http://cpanmin.us | perl - --self-upgrade
# or
wget -O - http://cpanmin.us | perl - --self-upgrade
我也在寻找一个简单的解决方案,发现这有效:
(echo y;echo o conf prerequisites_policy follow;echo o conf commit)|cpan
只是想我会把它发布在这里以防其他人出现。
制作您自己的 CPAN.pm 配置文件。最新版本的
cpan
命令有一个 -J
开关用于转储当前配置,还有一个 -j
开关用于加载您喜欢的任何配置。
我添加这些开关是因为我们在 CD 上分发 CPAN,当时 MiniCPAN 的大小可以低于 700Mb。您可以正常运行
cpan
,但添加了一个选项:
% cpan -j /CD/Volume/path/cpan_config.pm ....
在该示例中,配置会将 URL 列表设置为 CD 路径。我早就丢失了源文件,但我记得有一种方法可以动态地找出它在哪里,或者可能有一个程序可以做到这一点并将配置保存在某处。
一种方法是获取从一个系统运行一次后创建的 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;
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)'