Jak powiedzieć CPAN, aby zainstalował wszystkie zależności?

113

Jak powiedzieć CPAN, aby zainstalował wszystkie zależności?

Próbowałem ustawić je w cpan:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

Nadal kilka razy musiałem odpowiedzieć „y” (ale rzadziej niż wcześniej).

Czy jest sposób, aby zawsze go zainstalować i zainstalować? Chcę, żeby to było bez opieki.

Wydawałoby się, że chcę, aby flaga zawsze ufała CPAN, że zrobi właściwą rzecz, a jeśli sugeruje odpowiedź, chciałbym ją zastosować (zawsze uderzaj, Entergdy o coś zapyta).

Nifle
źródło
1
Być może powinienem dodać funkcję do mojego skryptu cpan, aby ustawić zmienne środowiskowe automatycznej instalacji w oparciu o ustawienie CPAN.pm. Zobacz odpowiedź tsee, która jest drugą połową problemu.
brian d foy

Odpowiedzi:

31

Oto jedna linijka powodująca trwałe zmiany, w tym automatyczna konfiguracja CPAN po raz pierwszy:

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'

Lub połącz go z local::libmodułem dla użytkowników nieuprzywilejowanych:

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'

Uruchom go przed użyciem powłoki CPAN lub czegokolwiek.

Atento
źródło
czy to nie to samo, co w @sdf anwer?
filimonov
83

Spróbuj ustawić PERL_MM_USE_DEFAULT w następujący sposób:

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

Powinno to spowodować, że CPAN będzie odpowiadać domyślnie na wszystkie monity.

kbosak
źródło
Jakikolwiek sposób, aby uczynić to trwałym, więc możesz po prostu wpisać „install My: Module” za każdym razem w cpan i zapamięta to? Czy edytować konfigurację?
Geoff,
3
Jeśli korzystasz z Linuksa, dodaj tę linię export PERL_MM_USE_DEFAULT=1do swojego ~ / .bashrc
andersand
1
Jeśli pojawi się błąd, Can't locate object method "install" via package "xxx" at -e line 1.dodaj „+” tuż przed nazwą modułu.
Yann Sagon
55

Najnowszą i najlepszą odpowiedzią na to pytanie jest użycie cpanm zamiast tego (nazywanego również App :: cpanminus lub cpanminus)!

OPIS

cpanminus to skrypt do pobierania, rozpakowywania, budowania i instalowania modułów z CPAN i nie robi nic więcej.

Jest wolny od zależności (może sam się ładować), nie wymaga konfiguracji i działa samodzielnie. Podczas pracy wymaga tylko 10 MB pamięci RAM.

Aby zainstalować go za pomocą bootstrapu:

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

lub jeśli używasz perlbrewpo prostu

perlbrew install-cpanm

lub z samego cpan:

cpan install App::cpanminus

Od tego momentu instaluj moduły, wykonując (w razie potrzeby jako root)

cpanm Foo::Bar
Joel Berger
źródło
1
Mam ten problem, kiedy używam cpanm, więc mówienie mi, żebym go używał, nie jest tutaj rozwiązaniem.
reinierpost
3
zamiast ślepego komentarza, zadaj jako nowe pytanie i link tutaj. Podejrzewam, że problem z uprawnieniami może być Twoim problemem
Joel Berger
Na Ubuntu 18.04 zainstalowałem z sudo apt install cpanminus make.
Pablo A
Głosowanie przeciw. Nie polecaj ludziom wykonywania wyjścia curl.
Richard Smith
28

Oto, czego jestem pewien, że szukasz:

cpan> o conf prerequisites_policy follow
cpan> o conf commit
Marka C.
źródło
27

Następuje zmiana następującego parametru na górze prerequisites_policy.

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

To zmieni go z „zapytaj / tak” na „tak” i przestanie cię pytać.

sdf
źródło
Dzięki! Potrzebuję tych dwóch opcji, aby nie pytać mnie wielokrotnie!
Dat TT
Zwróć uwagę, że są to domyślne wartości tych ustawień.
ikegami
6

Zestaw

prerequisites_policy

w konfiguracji.

Zobacz Zmienne konfiguracyjne .

Sinan Ünür
źródło
2
Czy monity dotyczą pobierania źródła modułu? Jeśli tak, zobacz opcję connect_to_internet_ok . W przeciwnym razie powiedz nam, jakich innych monitów starasz się unikać.
Sinan Ünür
Cóż, w zasadzie te ostatnie to „moduły opcjonalne”.
Nifle
Problem polega na tym, że rzeczy, które instalują się automatycznie. CPAN.pm nie ma szans, aby sobie z tym poradzić. Zobacz odpowiedź tsee.
brian d foy
1
Link wydaje się teraz martwy
OrangeDog
3

Osobiście tylko kilka razy próbowałem zmodyfikować ustawienia w ten sposób i faktycznie okazało się, że łatwiej jest zejść do CPAN.pmpowłoki cpanbez podawania argumentów, a następnie konfigurując CPAN.pmz interaktywnej zachęty:

$ cpan
cpan> o conf init

Spowoduje to zainicjowanie CPAN.pmnarzędzia do konfiguracji interfejsów. Po prostu przejrzyj go i określ „podążaj” tam, gdzie musisz (zapomniałem o pytaniu od ręki) i powinieneś być gotowy.

numberwhun
źródło
Możesz przekazać określone ustawienia do init. Na przykład o conf init prerequisites_policy. W ten sposób nie musisz przechodzić przez długi proces inicjalizacji, ale nadal otrzymujesz przyjazną podpowiedź dotyczącą danego ustawienia
ikegami
3

Okazało się, że jest to zdecydowanie najszybszy i najbardziej niezawodny sposób instalacji modułów CPAN:

yes | perl -MCPAN -e "CPAN::Shell->notest(qw!install Your::Module!)"
Vladimir Marchenko
źródło
To nie odpowiada na pytanie - OP chce mieć możliwość automatycznej instalacji zależności / automatycznego reagowania na monity.
William Turrell
W rzeczywistości instaluje zależności i automatycznie odpowiada na monity. Używam go cały czas, również w tej chwili. Ale jest potrzeba drobnej modyfikacji: yes|/root/bin/perl -MCPAN -e "CPAN::Shell->notest(qw!install Your::Module!)"
Vladimir Marchenko
Co ma zrobić „ yes”?
Peter Mortensen
2

Piszę to dla dobra osób, które mogły przyjść na tę stronę, szukając sposobu na zainstalowanie wszystkich zależności modułów wymaganych przez określony skrypt Perla. Napisałem do tego scenariusz:

Powinien być uruchamiany jako ./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";
    }
    }
}

Spowoduje to użycie cpanminus do zainstalowania wszystkich zależności modułów wymaganych przez skrypt. Jeśli cpanm nie jest zainstalowany, zainstaluje go.

Joel G Mathew
źródło