Como faço para dizer ao CPAN para instalar todas as dependências?


113

Como faço para dizer ao CPAN para instalar todas as dependências?

Tentei defini-los em cpan:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

Eu ainda tive que responder "s" algumas vezes (mas menos do que parecia).

Existe uma maneira de sempre prosseguir com a instalação? Eu quero deixar isso sem supervisão.

Parece que eu quero um flag para sempre confiar no CPAN para fazer a coisa certa, e se ele sugerir uma resposta, eu gostaria de segui-lo (sempre acerte Enterquando ele perguntar algo).


1
Talvez eu deva adicionar um recurso ao meu script cpan para definir as variáveis ​​de ambiente de instalação automática com base na configuração CPAN.pm. Veja a resposta de tsee, que é a outra metade do problema.
brian d foy

Respostas:


30

Aqui está o one-liner que torna essas alterações permanentes, incluindo a configuração automática do CPAN pela primeira vez:

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'

Ou combine-o com o local::libmódulo para usuários não privilegiados:

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'

Execute-o antes de usar o shell CPAN ou qualquer outro.


não é o mesmo que em @sdf anwer?
filimonov

83

Tente definir PERL_MM_USE_DEFAULT assim:

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

Isso deve fazer com que o CPAN responda o padrão a todos os prompts.


Há alguma maneira de tornar isso persistente, então você pode simplesmente digitar "install My: Module" no cpan a cada vez e ele se lembrará disso? Editar Config.pm?
Geoff

3
Se você estiver no Linux, adicione a linha export PERL_MM_USE_DEFAULT=1ao seu ~ / .bashrc
anders

1
Se você receber um erro, Can't locate object method "install" via package "xxx" at -e line 1.adicione um "+" logo antes do nome do módulo.
Yann Sagon

55

A melhor e mais recente resposta a essa pergunta é usar em seu cpanmlugar (também conhecido como App :: cpanminus ou cpanminus)!

DESCRIÇÃO

cpanminus é um script para obter, desempacotar, construir e instalar módulos do CPAN e nada mais.

É livre de dependências (pode se autoinicializar), requer configuração zero e é independente. Quando em execução, requer apenas 10 MB de RAM.

Para inicializar, instale-o:

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

ou se você estiver usando perlbrewsimplesmente

perlbrew install-cpanm

ou do próprio cpan:

cpan install App::cpanminus

A partir de então, instale os módulos executando (como root, se necessário)

cpanm Foo::Bar

1
Eu tenho esse problema quando uso cpanm, então dizer para usar não é a solução aqui.
reinierpost de

3
em vez de um comentário cego, faça uma nova pergunta e crie um link aqui. Suspeito que um problema de permissão pode ser o seu problema
Joel Berger,

Em um Ubuntu 18.04 com o qual instalei sudo apt install cpanminus make.
Pablo A

Votação negativa. Não recomendo que as pessoas executem a saída do curl.
Richard Smith

28

Tenho certeza de que você está procurando:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

27

A seguir, alterando o seguinte parâmetro além da prerequisites_policy.

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

Isso mudará de "perguntar / sim" para "sim" e parará de perguntar a você.


Obrigado! Eu preciso dessas duas opções para que não me pergunte novamente e novamente!
Dat TT

Observe que esses são os valores padrão para essas configurações.
ikegami


6

Conjunto

prerequisites_policy

na configuração.

Consulte Variáveis ​​de configuração .


2
Os prompts estão relacionados à fonte do módulo de download? Em caso afirmativo, consulte a opção connect_to_internet_ok . Caso contrário, diga-nos quais outras solicitações você está tentando evitar.
Sinan Ünür

Bem, basicamente, estes últimos eram "módulos opcionais".
Nifle de

O problema são coisas que são instaladas automaticamente por conta própria. CPAN.pm não tem a chance de lidar com essas coisas. Veja a resposta de tsee.
brian d foy

1
O link agora parece estar morto
OrangeDog

3

Pessoalmente, tentei apenas algumas vezes modificar as configurações dessa forma e, na verdade, achei mais fácil inserir no CPAN.pmshell cpansem fornecer argumentos e, em seguida, configurar CPAN.pmno prompt interativo:

$ cpan
cpan> o conf init

Isso iniciará o CPAN.pmutilitário de configuração de interfaces. Simplesmente percorra-o e especifique "seguir" onde você precisa (esqueci a pergunta de improviso), e você estará pronto para ir.


Você pode passar configurações específicas para init. Por exemplo o conf init prerequisites_policy,. Dessa forma, você não precisa passar pelo longo processo de inicialização, mas ainda obtém o prompt amigável para a configuração em questão
ikegami

3

Eu descobri que esta é, de longe, a maneira mais rápida e confiável de instalar módulos CPAN:

yes | perl -MCPAN -e "CPAN::Shell->notest(qw!install Your::Module!)"

Isso não responde à pergunta - o OP deseja uma maneira de instalar dependências / responder automaticamente aos prompts.
William Turrell

Na verdade, ele instala dependências e responde automaticamente aos prompts. Eu o uso o tempo todo, inclusive neste exato momento. Mas há uma necessidade de uma pequena modificação: yes|/root/bin/perl -MCPAN -e "CPAN::Shell->notest(qw!install Your::Module!)"
Vladimir Marchenko

O que " yes" deve fazer?
Peter Mortensen

2

Estou escrevendo isso para o benefício de pessoas que podem ter vindo a esta página em busca de uma maneira de instalar todas as dependências de módulo necessárias para um script perl específico. Eu escrevi um roteiro para isso:

Deve ser executado como ./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";
    }
    }
}

Isso usará cpanminus para instalar todas as dependências de módulo exigidas pelo seu script. Se o cpanm não estiver instalado, ele o instalará.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.