Перемещение / клонирование 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 с одной версии на другую путем переустановки их для новой версии, которая только что была создана.