Как сообщить CPAN об установке всех зависимостей?


113

Как сообщить CPAN об установке всех зависимостей?

Я пробовал установить их cpan:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

Мне все же пришлось пару раз ответить «у» (но, кажется, меньше, чем раньше).

Есть ли способ заставить его всегда идти вперед и устанавливать? Я хочу оставить его без присмотра.

Казалось бы, я хочу, чтобы флаг всегда доверял CPAN, чтобы делать правильные вещи, и если он предлагает ответ, я хотел бы следовать ему (всегда нажимайте, Enterкогда он что-то спрашивает).


1
Возможно, мне следует добавить функцию в мой скрипт cpan, чтобы установить переменные среды автоматической установки на основе настройки CPAN.pm. См. Ответ Ци, а это вторая половина проблемы.
brian d foy

Ответы:


31

Вот краткое описание, делающее эти изменения постоянными, включая автоматическую настройку 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 или чего-то еще.


разве это не то же самое, что и в ответе @sdf?
filimonov

83

Попробуйте установить PERL_MM_USE_DEFAULT так:

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

Это должно заставить CPAN отвечать на все запросы по умолчанию.


Есть ли способ сделать это постоянным, чтобы вы могли просто каждый раз вводить "install My: Module" в cpan, и он это запомнил? Отредактировать Config.pm?
Джефф

3
Если вы используете linux, добавьте строку export PERL_MM_USE_DEFAULT=1в свой ~ / .bashrc
andersand

1
Если вы получили сообщение об ошибке, Can't locate object method "install" via package "xxx" at -e line 1.добавьте "+" прямо перед названием модуля.
Yann Sagon

55

Самый последний и лучший ответ на этот вопрос - использовать cpanmвместо него (также называемый App :: cpanminus или cpanminus)!

ОПИСАНИЕ

cpanminus - это скрипт для получения, распаковки, сборки и установки модулей из CPAN, который больше ничего не делает.

Он свободен от зависимостей (может загружаться сам по себе), не требует настройки и автономен. При работе требуется всего 10 МБ ОЗУ.

Для начальной установки:

curl -L http://cpanmin.us | perl - --sudo App::cpanminus

или если вы используете perlbrewпросто

perlbrew install-cpanm

или из самого cpan:

cpan install App::cpanminus

С этого момента устанавливайте модули, выполнив (при необходимости от имени пользователя root)

cpanm Foo::Bar

1
У меня есть эта проблема, когда я использую cpanm, поэтому сказать мне использовать ее - не решение.
Reinierpost

3
а не слепой комментарий, задайте новый вопрос и ссылку здесь. Я подозреваю, что проблема в разрешении - это ваша проблема,
Джоэл Бергер,

На Ubuntu 18.04 я установил sudo apt install cpanminus make.
Pablo A

Голосование против. Не рекомендую людям выполнять вывод curl.
Ричард Смит

28

Вот что, я уверен, вы ищете:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

27

Далее следует изменение следующего параметра поверх prerequisites_policy.

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

Это изменит его с «спросить / да» на «да» и перестанет спрашивать вас.


Спасибо! Мне нужны эти два варианта, чтобы он меня не спрашивал снова и снова!
Дата TT

Обратите внимание, что это значения по умолчанию для этих настроек.
Ikegami


6

Устанавливать

prerequisites_policy

в комплектации.

См. Переменные конфигурации .


2
Связаны ли запросы с загрузкой исходного кода модуля? Если это так, см. Параметр connect_to_internet_ok . В противном случае сообщите нам, каких еще подсказок вы пытаетесь избежать.
Sinan Ünür

Ну, в основном, эти последние были «дополнительными модулями».
Nifle

Проблема в том, что вещи устанавливаются автоматически. CPAN.pm не имеет возможности справиться с этим. См. Ответ.
brian d foy

1
Ссылка теперь кажется мертвой
OrangeDog

3

Лично я всего пару раз пытался изменить параметры таким образом, и на самом деле обнаружил, что проще перейти в CPAN.pmоболочку, не задавая cpanаргументов, а затем настроив CPAN.pmиз интерактивной подсказки:

$ cpan
cpan> o conf init

Это CPAN.pmзапустит утилиту настройки интерфейсов. Просто пропустите его и укажите «следовать» туда, где вам нужно (я забыл вопрос), и все будет хорошо.


Вы можете передать определенные настройки в init. Например, o conf init prerequisites_policy. Таким образом, вы не должны пройти через длительный процесс инициализации, но все же получить дружественное приглашение для установки в вопросе
Икеги

3

Я обнаружил, что это, безусловно, самый быстрый и надежный способ установки модулей 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" должно делать?
Питер Мортенсен

2

Я пишу это в интересах людей, которые, возможно, пришли на эту страницу в поисках способа установки всех зависимостей модулей, необходимых для конкретного сценария 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 не установлен, он установит его.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.