Comment dire à CPAN d'installer toutes les dépendances?


113

Comment dire à CPAN d'installer toutes les dépendances?

J'ai essayé de les mettre en cpan:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

J'ai encore dû répondre "y" plusieurs fois (mais moins qu'avant, on en a envie).

Existe-t-il un moyen de le faire toujours aller de l'avant et de l'installer? Je veux le faire sans surveillance.

Il semblerait que je veux qu'un drapeau fasse toujours confiance au CPAN pour faire la bonne chose, et s'il suggère une réponse, je voudrais la suivre (toujours frapper Enterquand il demande quelque chose).


1
Je devrais peut-être ajouter une fonctionnalité à mon script cpan pour définir les variables d'environnement d'installation automatique en fonction du paramètre CPAN.pm. Voir la réponse de tsee, qui est l'autre moitié du problème.
brian d foy

Réponses:


31

Voici le one-liner rendant ces changements permanents, y compris la configuration CPAN automatique pour la première fois:

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 combinez-le avec un local::libmodule pour les utilisateurs non privilégiés:

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'

Exécutez-le avant d'utiliser le shell CPAN ou autre.


n'est-ce pas la même chose que dans @sdf anwer?
filimonov

83

Essayez de définir PERL_MM_USE_DEFAULT comme ceci:

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

Cela devrait faire de CPAN la réponse par défaut à toutes les invites.


Un moyen de rendre cela persistant, donc vous pouvez simplement taper "installer My: Module" dans cpan à chaque fois et il s'en souviendra? Modifier Config.pm?
Geoff

3
Si vous êtes sous Linux, ajoutez la ligne export PERL_MM_USE_DEFAULT=1à votre ~ / .bashrc
andersand

1
Si vous obtenez une erreur, Can't locate object method "install" via package "xxx" at -e line 1.ajoutez un "+" juste avant le nom du module.
Yann Sagon

55

La dernière et meilleure réponse à cette question est d'utiliser à la cpanmplace (également appelée App :: cpanminus ou cpanminus)!

LA DESCRIPTION

cpanminus est un script pour obtenir, décompresser, construire et installer des modules à partir du CPAN et ne fait rien d'autre.

Il est sans dépendance (peut s'amorcer lui-même), ne nécessite aucune configuration et est autonome. Lors de l'exécution, il ne nécessite que 10 Mo de RAM.

Pour bootstrap, installez-le:

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

ou si vous utilisez perlbrewsimplement

perlbrew install-cpanm

ou de cpan lui-même:

cpan install App::cpanminus

À partir de là, installez les modules en exécutant (en tant que root si nécessaire)

cpanm Foo::Bar

1
J'ai ce problème lorsque j'utilise cpanm, donc me dire de l'utiliser n'est pas la solution ici.
reinierpost

3
plutôt qu'un commentaire aveugle, veuillez poser une nouvelle question et un lien ici. Je soupçonne qu'un problème d'autorisations pourrait être votre problème
Joel Berger

Sur un Ubuntu 18.04 que j'ai installé avec sudo apt install cpanminus make.
Pablo A

Vote à la baisse. Ne recommandez pas aux gens d'exécuter la sortie de curl.
Richard Smith

28

Voici ce que je suis sûr que vous recherchez:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

27

La modification du paramètre suivant en plus de prerequisites_policy suit.

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

Cela le changera de "demander / oui" à "oui" et l'empêchera de vous demander.


Merci! J'ai besoin de ces deux options pour qu'il ne me le demande pas encore et encore!
Dat TT

Notez que ce sont les valeurs par défaut de ces paramètres.
ikegami


6

Ensemble

prerequisites_policy

dans la configuration.

Voir Variables de configuration .


2
Les invites sont-elles liées au téléchargement de la source du module? Si tel est le cas, consultez l' option connect_to_internet_ok . Sinon, dites-nous quelles autres invites vous essayez d'éviter.
Sinan Ünür

En gros, ces derniers étaient des "modules optionnels".
Nifle

Le problème, ce sont les éléments qui s'installent automatiquement. CPAN.pm n'a pas la possibilité de gérer ce genre de choses. Voir la réponse de tsee.
brian d foy

1
Le lien semble maintenant mort
OrangeDog

3

Personnellement, je n'ai essayé que quelques fois de modifier les paramètres de cette manière et j'ai trouvé qu'il était plus facile de passer dans le CPAN.pmshell en cpanne donnant aucun argument, puis en configurant à CPAN.pmpartir de l'invite interactive:

$ cpan
cpan> o conf init

Cela lancera l' CPAN.pmutilitaire de configuration des interfaces. Parcourez-le simplement et spécifiez "suivre" là où vous avez besoin (j'oublie la question au hasard), et vous devriez être prêt à partir.


Vous pouvez transmettre des paramètres spécifiques à init. Par exemple o conf init prerequisites_policy,. De cette façon, vous n'avez pas à passer par le long processus d'initialisation, mais obtenez toujours l'invite amicale pour le paramètre en question
ikegami

3

J'ai trouvé que c'était, de loin, le moyen le plus rapide et le plus fiable d'installer des modules CPAN:

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

Cela ne répond pas à la question - l'OP veut un moyen d'installer automatiquement les dépendances / de répondre automatiquement aux invites.
William Turrell

En fait, il installe les dépendances et répond automatiquement aux invites. Je l'utilise tout le temps, même à ce moment précis. Mais il y a un besoin pour une petite modification: yes|/root/bin/perl -MCPAN -e "CPAN::Shell->notest(qw!install Your::Module!)"
Vladimir Marchenko

Qu'est-ce que " yes" est censé faire?
Peter Mortensen

2

J'écris ceci pour le bénéfice des personnes qui sont peut-être venues sur cette page à la recherche d'un moyen d'installer toutes les dépendances de module nécessaires à un script perl particulier. J'ai écrit un script pour cela:

Il devrait être exécuté comme ./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";
    }
    }
}

Cela utilisera cpanminus pour installer toutes les dépendances de module requises par votre script. Si cpanm n'est pas installé, il l'installera.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.