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

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

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

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


person Hamster    schedule 12.03.2015    source источник
comment
Вы можете воспользоваться подходом, описанным в Как переустановить все модули на новом Perl, но запишите вывод perlbrew list-modules в файл, скопируйте файл на другую машину и используйте его в качестве ввода для perlbrew exec. Однако для этого потребуется дважды загрузить весь набор модулей, и вы получите последнюю версию всего, поэтому у вас могут быть несоответствия версий между двумя вашими установками.   -  person ThisSuitIsBlackNot    schedule 12.03.2015
comment
@ThisSuitIsBlackNot ++ С cpanm вы можете использовать версии - как в cpanm [email protected], но нет возможности получить текущий список версий с 'perlbrew list-modules. Один из способов получить довольно хороший список текущих версий модулей, установленных, скажем, под ~/perl5/, состоит в том, чтобы искать любые файлы install.json и обрабатывать их. например, find ~/perl5/ -name install.json -exec jq -M '.name + "@" + .version' {} +. Это предполагает, что install.json существует. Вероятно, потребуется настроить формат вывода, который так нравится perlbrew exec cpanm.   -  person G. Cito    schedule 12.03.2015


Ответы (3)


В 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

or:

 cpanm --export-cpanfile
 perlbrew list_installed_as_cpanfile

может быть долгожданной функцией.

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

Предложение использовать find и jq (от @Ilmari Karonen см. Upgrade все модули, установленные 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} ) ;
} 
person G. Cito    schedule 12.03.2015
comment
см. также: cpanm-meta-checker ... - person G. Cito; 14.03.2015

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

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

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

person Len Jaffe    schedule 12.03.2015
comment
++ Я не понимаю, как это не сработает, если у вас есть только модули Perl (без XS) и простая установка. Мой подход (см. мой ответ) заключался в том, чтобы скопировать исходные файлы из ~/cpanm и установить их напрямую, чтобы избежать загрузки, - казался таким же хакерским, но работал для установки local::lib perlbrew, в которой было установлено всего несколько десятков модулей. Я использовал perlbrew для сборки самого perl (конечно, той же версии) из исходников. - person G. Cito; 12.03.2015
comment
Я использовал perlbrew для установки всего, что мне было нужно, локализованного в каталоге perlbrew, включая модули XS и чистый perl. perlbrew разделяет каждую версию perl, поэтому я мог просто заархивировать тег git, начиная с корневого каталога версии. Несколько строк скрипта для установки правильных переменных окружения perlbrew на целевом сервере, и все заработало. Понравилось бы мне решение, использующее развивающиеся стандарты? да. Но этого не было в картах для этого проекта. - person Len Jaffe; 13.03.2015

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

person Alexander Hartmaier    schedule 22.03.2015