2015-03-12 36 views
7

Używam perlbrew. Zainstalowałem wiele modułów cpan pod numerem perlbrew perl-5.20.2.Przenoszenie/klonowanie perlbrew zainstalowanego perl plus wszystkie dodatkowe moduły cpan

Czy istnieje sposób (lub jaki jest najlepszy sposób) do instalacji tarballa mojego perl-5.20.2 plus wszystkie moduły CPAN, które zainstalowałem pod Perlbrew, aby móc je sklonować na inną maszynę?

Jestem świadomy perlbrew download perl-5.20.2, ale wydaje mi się, że tylko plik tarl perl-5.20.2 i nie wszystkie moduły CPAN, które zainstalowałem.

+2

Można zastosować podejście opisane w [Jak ponownie zainstalować wszystkie moduły na nowym perlu] (http://perlbrew.pl/Reinstall-All-Modules-On-New-Perl.html), ale wpisz dane wyjściowe z ' perlbrew list-modules' do pliku, skopiuj plik na inny komputer i używaj go jako wejścia dla 'perlbrew exec'. Jednak wymagałoby to dwukrotnego pobrania całego zestawu modułów, a otrzymasz najnowszą wersję wszystkiego, więc możesz mieć niedopasowania wersji między dwiema instalacjami. – ThisSuitIsBlackNot

+1

@ThisSuitIsBlackNot ++ Z 'cpanm' możesz używać wersji - jak w' cpanm Plack @ 0.9990', ale nie ma opcji, aby uzyskać aktualną listę wersji z '' perlbrew list-modules'. Jednym ze sposobów uzyskania całkiem dobrej listy aktualnych wersji modułów zainstalowanych pod - powiedzmy - '~/perl5 /' jest poszukiwanie plików 'install.json' i ich przetwarzanie. * np. * 'find ~/perl5/-name install.json -exec jq -M '.name +" @ "+ .version' {} +'. Zakłada się, że istnieje plik 'install.json'. Poprawia format wyjściowy tak, aby 'perlbrew exec cpanm' podobało się prawdopodobnie –

Odpowiedz

5

Za pomocą perlbrew można użyć polecenia lib, aby utworzyć local::lib, aby przejść do perlbijskiego perla.

perlbrew lib create [email protected]_reqs 

Następnie, jeśli wszystko pójdzie dobrze, po zainstalowaniu modułów będzie je znaleźć w:

$HOME/.perlbrew/libs/[email protected]_reqs 

Jeśli nie używać podejścia perbrew lib create do zarządzania modułami, a następnie są one zainstalowane na $HOME/perl5/perlbrew/perls/perl-5.20.1/lib/site_perl/5.20.2. Klonowanie któregoś z tych katalogów może działać, ale prawdopodobnie lepiej będzie ponownie zainstalować wszystkie moduły, korzystając z technik z perlbrew.pl website, ponieważ moduły XS powinny zostać przebudowane itd..

Jeśli chcesz ponownie wykorzystać i śledzić źródła lokalne, najbardziej niezawodnym rozwiązaniem jest utworzenie lokalnego lustra CPAN do pracy z wykorzystaniem App::lcpan lub minicpan. Jeśli już pobrać źródła przy użyciu cpanm szybkie hackish podejście jest znalezienie plików źródłowych (pod $HOME/.cpanm/) i zrobić coś takiego w swojej powłoce:

% mkdir ~/cpansourcefiles 
% for source in ~/.cpanm/work/*/* ; do cp $source ~/cpansourcefiles ;done 

Następnie można dostać cpanm zainstalować przy użyciu tych źródeł przez przekazując nazwę pliku jako argument zamiast nazwy modułu:

% cpanm ~/cpansourcefiles/List-MoreUtils-0.406.tar.gz 

lub nawet:

% cpanm ~/cpansourcefiles/* 

NB: YMMV, ponieważ jest to podatne na złamanie i może pomijać niektóre wersje i sprawdzanie zależności, które zwykle uzyskuje się z cpanm, ale jest prostsze niż konfiguracja lustra, gdy działa.


Kilka innych wysokich narzędzia zasilane które sprawiają, że wdrażanie aplikacji Perl wytrzymałe i niezawodne:


EDIT:

Narzędzia takie jak perlbrew, pinto, i cpanm są ogromnym ulepszeniem w porównaniu do zbieranego osobiście zbioru skryptów do robienia podobnych rzeczy. Dziękujemy wszystkim programistom i współautorom tych narzędzi!

nie jestem świadomy żadnej funkcji w cpanm lub perlbrew które pozwalają niezawodnie produkować listę zainstalowanych plików i ich wersje. Coś jak:

cpanm --list_installed 
perlbrew list_installed_versions 

czyli

cpanm --export-cpanfile 
perlbrew list_installed_as_cpanfile 

może być pożądaną cechą.

Jak zauważyłem w komentarzu do powyższego OP, można zebrać przydatne informacje o instalacji modułu z plików install.json, które są instalowane przez cpanm. Moduły takie jak CPAN::Meta, Module::Metadata i Distribution::Metadata również mogą być pomocne.

Sugestia używać find i jq (który był z @Ilmari Karonen zobaczyć Upgrade all modules installed by local::lib w this answer) doprowadziły do ​​szybkiego niedokończonej siekać poniżej. Jednym z wyzwań/kwestią jest tam czasami install.json pliki lewej leżące wokół w wielu miejscach:

  • lib/perl5/$Config{archname}/.meta/Whatever-Mod-1.0050000/install.json
  • lib/perl5/$Config{archname}/.meta/Whatever-Mod-1.0090000/install.json
  • ... itp

Jest to prawdopodobnie dlatego, że te pliki są nie zawsze czysto usuwane podczas aktualizacji, ponownej instalacji lub innego muckingu na temat błędów PEBKAC. Aby działał poprawnie, poniższy kod powinien zostać zmieniony, aby zauważył, że istnieje wiele kombinacji nazw i wersji modułu install.json, a następnie dokładniej sprawdza, czy moduł jest zainstalowany i otrzymuje jego wersję. Skrypt powinien mieć opcje: $dir może pochodzić od @ARGV. TIMTOWTDI, "well volunteered", itd..

#!perl 
# list_installed_mods.pl 
# DOES NOT THOROUGHLY VERIFY CURRENT VERSION 

use File::Find;          
use JSON;          
use v5.16;  
my $dir = "$ENV{HOME}/perl5/lib/perl5";  

for my $installed (find_installed($dir)) {  
    say parse_install_json($installed);  
} 

sub find_installed { 
    my $libdir = shift;  
    my @files; 
    File::Find::find ({ wanted => 
    sub { push @files, $File::Find::name if /install\.json/i} }, 
    $libdir); 
    return @files; 
} 

sub parse_install_json { 
    my $filename = shift; 
    my $json_text = do { 
    open(my $json_fh, "<:encoding(UTF-8)", $filename)     
     or die("Can't open \$filename\": $!\n");       
    local $/; 
    <$json_fh>               
    }; 
    my $install = decode_json($json_text) ; 
    return ($install->{name} ,"\@", $install->{version}) ; 
} 
+0

zobacz także: [' cpanm-meta-checker'] (https://metacpan.org/release/App-cpanm-meta-checker). .. –

1

Prawdopodobnie nie jest to najlepszy sposób, ale oto, co ostatnio zrobiłem.

Zrobiłem moją Perlbrowską wersję Perla na repozytorium git, więc mogłem użyć git archive, aby utworzyć dla mnie tar.Podobnie z moimi modułami Local::Lib. Potem napisałem trochę skryptów, żeby móc oznaczyć master, budować archiwa z tagów, kopiować archiwum na zdalny serwer, rozpakowywać i chmod/chown pliki.

Zrobiłem to, ponieważ w tamtym czasie było to szybkie i brudne rozwiązanie, ponieważ nie miałem czasu na skonfigurowanie Pinto lub Kartonu.

+0

++ Nie widzę, jak to by nie zadziałało, gdybyś miał tylko moduły perl (bez XS) i prostą instalację. Moje podejście (patrz moja odpowiedź) - które miało na celu skopiowanie plików źródłowych z '~/cpanm' i zainstalowanie ich bezpośrednio w celu uniknięcia pobierania - czuło się podobnie hackowskie, ale działało dla instalacji' local :: lib' perlbrew, która miała tylko kilkadziesiąt modułów zainstalowany. Użyłem 'perlbrew' do zbudowania samego perla (tej samej wersji oczywiście) ze źródła. –

+1

Użyłem perlbrew do zawarcia wszystkiego, czego potrzebowałem, zlokalizowałem pod katalogiem perlbrew, włączając XS i czyste moduły Perla. perlbrew zachowuje każdą wersję perla, dzięki czemu mógłbym zaatakować tag git zaczynający się od katalogu głównego wersji. Kilka linijek skryptu, aby ustawić prawidłowe peryferyjne znaki env na serwerze docelowym, i wszystko działało. Woudl Podobało mi się rozwiązanie wykorzystujące zmieniające się standardy? Tak. Ale nie było w kartach tego projektu. –

1

To tylko część rozwiązania, ale jak dotąd wspomniano: skrypt konfiguracyjny Perla ma parametr -D relocateableinc od niektórych wersji. Podczas budowania/warzenia Perla z tą opcją ścieżki do biblioteki lib nie będą traktowane jako bezwzględna ścieżka, lecz do pliku binarnego perl, który pozwala przenieść cały katalog lub zmienić jego nazwę. Buduję wszystkie moje Perły z tą opcją od lat i nie spowodowało to żadnych problemów.