Перемещение / клонирование perlbrew установленного perl плюс все дополнительные модули cpan

Я использую perlbrew. Я установил много модулей cpan под perlbrew perl-5.20.2,

Есть ли способ (или как лучше) выполнить установку tarball моего perl-5.20.2 плюс все модули CPAN, которые я установил под perlbrew, чтобы я мог просто клонировать его на другую машину?

Я в курсе perlbrew download perl-5.20.2 но это похоже только на tarball perl-5.20.2, а не на все модули CPAN, которые я установил.

4 ответа

С perlbrew вы можете использовать lib Команда для создания local::lib пойти с твоим perlbrew perl.

perlbrew lib create perl-5.20.2@app_reqs

Затем, если все пойдет хорошо, при установке модулей вы найдете их в:

$HOME/.perlbrew/libs/perl-5.20.2@app_reqs

Если вы не используете perbrew lib create подход к управлению вашими модулями, тогда они устанавливаются в $HOME/perl5/perlbrew/perls/perl-5.20.1/lib/site_perl/5.20.2, Клонирование любого из этих каталогов может сработать, но вам, вероятно, лучше переустановить все модули, используя методы с веб-сайта perlbrew.pl, так как модули XS должны быть перестроены и т. Д.

Если вы хотите повторно использовать и отслеживать локальные источники, наиболее надежным подходом является создание локального зеркала CPAN для работы с использованием App::lcpan или же minicpan, Если вы уже загрузили источник, используя cpanm быстрый хакерский подход заключается в поиске исходных файлов (под $HOME/.cpanm/) и сделайте что-то подобное в вашей оболочке:

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

Тогда вы можете получить cpanm установить с использованием этих источников, передав имя файла в качестве аргумента вместо имени модуля:

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

или даже:

% cpanm ~/cpansourcefiles/*  

NB: YMMV, так как он подвержен поломкам и может пропустить некоторые проверки версий и зависимостей, которые вы обычно получаете с cpanm но это проще, чем настроить зеркало, когда оно работает.


Несколько других мощных инструментов, делающих развертывание приложений Perl надежным и надежным:


РЕДАКТИРОВАТЬ:

Инструменты как perlbrew, pinto, carton, а также cpanm это огромное улучшение по сравнению с пестрой личной коллекцией сценариев для выполнения подобных вещей. Спасибо всем разработчикам и авторам этих инструментов!

Я не знаю каких-либо особенностей в cpanm или же perlbrew которые позволяют надежно составить список установленных файлов и их версий. Что-то вроде:

 cpanm --list_installed
 perlbrew list_installed_versions

или же:

 cpanm --export-cpanfile
 perlbrew list_installed_as_cpanfile

может быть желанной особенностью.

Как я отмечал в комментарии к OP выше, вы можете получить полезную информацию об установке вашего модуля из install.json файлы, которые установлены cpanm, Модули как CPAN::Meta, Module::Metadata а также Distribution::Metadata может быть полезным

Предложение использовать find а также jq (который был от @Ilmari Karonen, см. Обновление всех модулей, установленных local::lib в этом ответе) привел к быстрому незаконченному взлому ниже. Одна проблема / проблема есть иногда install.json файлы остались валяться в нескольких местах:

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

Вероятно, это связано с тем, что эти файлы не всегда удаляются без ошибок при обновлении, переустановке или других угрозах PEBKAC. Для правильной работы приведенный ниже код необходимо изменить, чтобы он замечал наличие нескольких комбинаций имя-версия модуля. install.json а затем проводит более тщательную проверку того, что модуль установлен и получает его версию. Скрипт должен иметь параметры: $dir может прийти из @ARGV, TIMTOWTDI, "хорошо добровольно" и т. Д.

#!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} ) ;
} 

Это только часть решения, но о нем стоит упомянуть: в некоторых версиях скрипта Perl есть параметр -D relocateableinc. При сборке / создании Perl с этой опцией пути lib будут не жестко закодированы как абсолютный путь, а относительно двоичного файла perl, который позволяет перемещать весь каталог или просто переименовывать его. Я собираю все свои Perl с этой опцией с годами, и это до сих пор не создавало проблем.

Возможно, не лучшим образом, но вот что я недавно сделал.

Я отправил свою версию Perlbrewed Perl в git-репо, чтобы я мог использовать git archive создать смолу для меня. Аналогично с моим Local::Lib модули. Затем я написал немного сценариев, чтобы я мог пометить мастер, построить архивы из тега, скопировать архив на удаленный сервер, распаковать и chmod/chown файлы.

Я сделал это, потому что в то время это было быстрое и грязное решение не иметь времени, чтобы настроить Пинто или Картон.

Команда clone-modules может быть тем, что вы ищете.

Пример вывода для приведенной ниже команды выглядит следующим образом:

perlbrew clone-modules perl-5.36.0 perl-5.37.6

      Installing 398 modules from perl-5.36.0 to perl-5.37.6 ...

! Couldn't find module or a distribution AWS-Signature4
Successfully installed Algorithm-Diff-1.201
Successfully installed Algorithm-Loops-1.032
Successfully installed Module-Build-0.4231
Successfully installed ExtUtils-PkgConfig-1.16
Successfully installed Alien-VideoLAN-LibVLC-0.04
Successfully installed File-Slurp-9999.32

Вы можете запустить эту команду после создания новогоperlсperlbrewдля переноса (последних версий) модулей CPAN с одной версии на другую путем переустановки их для новой версии, которая только что была создана.

Другие вопросы по тегам