Как я могу установить специализированные среды для различных приложений Perl?
-
07-07-2019 - |
Вопрос
Есть ли что-нибудь эквивалентное или близкое по функциональности к Python virtualenv, но для Perl?
Я занимался некоторой разработкой на Python, и возможность установки несистемных версий модулей в отдельной среде без создания какого-либо беспорядка является огромным преимуществом.Теперь мне нужно работать над новым проектом на Perl, и я ищу что-то вроде virtualenv, но для Perl.Можете ли вы предложить какой-либо эквивалент Perl или замену virtualenv для python?
Я пытаюсь настроить X различных наборов несистемных пакетов Perl для Y различных приложений, которые будут развернуты.Что еще хуже, для этих приложений могут потребоваться разные версии одного и того же пакета, поэтому каждое из них может потребовать установки в отдельном модуле / библиотечной среде.Возможно, вы захотите сделать это вручную для X < Y < 3.Но вы не должны делать это вручную для 10 > Y > X.
В идеале то, что я ищу, должно работать следующим образом:
perl virtualenv.pl my_environment
. my_environment/bin/activate
wget http://.../foo-0.1.tar.gz
tar -xzf foo-0.1.tar.gz ; cd foo-0.1
perl Makefile.pl
make install # <-- package foo-0.1 gets installed inside my_environment
perl -MCPAN -e 'install Bar' # <-- now package Bar with all its deps gets installed inside my_environment
Решение
Есть такой инструмент, который называется local::lib
это завершает всю работу за вас, так же как virtualenv
.Это будет:
- Настройка
@INC
в том процессе, в котором он используется. - Установленный
PERL5LIB
и другие подобные вещи для дочерних процессов. - Установите правильные переменные, чтобы убедить CPAN,
MakeMaker
,Module::Build
, и т.д.установить библиотеки и сохранить конфигурацию в локальном каталоге. - Установленный
PATH
таким образом, можно найти установленные двоичные файлы. - Выводите переменные среды в стандартный вывод при использовании из командной строки, чтобы вы могли поместить
eval $(perl -Mlocal::lib)
в вашем.profile
а потом по большей части забывают об этом.
Другие советы
Проводя расследование, я обнаружил эту и некоторые другие страницы (этот слишком старый и скучает по новым технологиям, этот пост на reddit - небольшое недоразумение).
Проблема с perlbrew и plenv заключается в том, что они, похоже, являются заменой pyenv, а не virtualenv.Как отмечалось здесь pyenv предназначен для управления версиями python, virtualenv - для управления версиями модулей для каждого проекта.Так что, да, в чем-то похоже на локальный:: библиотека, но с лучшим удобством использования.
Я еще не видел правильного ответа на этот вопрос, но из того, что я прочитал, похоже, что лучшим решением является что-то вроде:
- Управление версиями Perl: пленв/перлбрю (поскольку большинство людей предпочитают более современный plenv на основе bash, чем основанный на perl perlbrew, насколько я вижу)
- Управление версиями модулей: Картонная коробка
- Установка модуля:cpan (скважина, кпанминус во всяком случае, ymmv)
Честно говоря, это не идеальный вариант настроен, хотя я все еще учусь, так что, возможно, он все же будет лучше.Это просто кажется неправильным.Это, конечно, не замена подобного подобному для virtualenv.
Есть пара постов, которые я нашел, в которых говорится : "IT является возможный" но ни один из них не продвинулся дальше.
Я не уверен, что это то же самое, что и virtualenv
, о котором вы говорите, но посмотрите специальную переменную @INC
на странице руководства perlvar
.
Я использовал schroot
для этой цели. Это немного тяжелее, чем virtualenv, но вы можете быть уверены, что ничего не просочится в то, что не должно.
Schroot
управляет средой chroot для вас, но монтирует ваш домашний каталог в chroot, чтобы он выглядел как обычный сеанс оболочки, просто используя двоичные файлы и библиотеки в chroot.
Я думаю, что это может быть только Debian / Ubuntu.
После настройки <=> ваш приведенный выше скрипт будет выглядеть так
schroot -c my_perl_dev
wget ...
См. http://www.debian-administration.org/articles/566 за интересную статью об этом
Программы могут изменять, какие каталоги они проверяют на наличие библиотек, с помощью use lib
. Этот каталог lib может быть относительно текущего каталога. Библиотеки из этих каталогов будут использоваться перед системными библиотеками, поскольку они размещаются в начале массива @INC.
Я считаю, что cpan также может устанавливать библиотеки в определенные каталоги. Конечно, cpan использует сайт CPAN , чтобы установить объекты, так что это может быть не лучшим вариантом. р>
Также ознакомьтесь с perl-virtualenv . По-видимому, это обертка вокруг local :: lib, как и предлагалось Хоббсом, но создает bin / activ и bin / deactivate, чтобы вы могли использовать его так же, как инструмент python.
Я пользуюсь им довольно успешно в течение месяца или около того, даже не осознавая, что он не был таким стандартом, как, возможно, и должно быть. Р>
Это значительно упрощает настройку работающего virtualenv для perl, поскольку local: lib сообщит вам, какие переменные вам нужно установить, и т. д. perl-virtualenv создаст сценарий активации, который сделает это за вас.
Что я делаю, так это запускаю оболочку CPAN (cpan) и устанавливаю из нее свой собственный Perl 5.10 (Я считаю, что команда установить Perl-5.10). Это попросит различные конфигурации настройки; Я должен указать путь к папке / usr / local (или в другом месте установки, отличном от стандартного).
Затем я помещаю его результирующее местоположение в свой исполняемый файл $ PATH перед стандартным perl и использую его оболочку CPAN для установки нужных мне модулей (обычно много). Все мои Perl-скрипты начинаются со строки
#!/usr/bin/env perl
Никогда не было проблем с таким подходом.
Похоже, вам просто нужно использовать конфигурацию INSTALL_BASE для Makefile.PL (или параметр --install_base для Build.PL)? Что именно вам нужно для решения? Похоже, вам просто нужно установить установленный модуль в нужном месте. Вы представили свою проблему как XY-проблему , указав, что вы считаете решение состоит в том, чтобы позволить нам помочь вам с вашей задачей.
См. Как сохранить каталог моего собственного модуля / библиотеки? в perlfaq8, например.
Если вы загружаете модули из CPAN, последняя команда cpan
(в App :: Cpan ) имеет переключатель -j
, позволяющий выбирать альтернативные файлы конфигурации CPAN.pm. В этих файлах конфигурации вы можете установить параметры CPAN.pm для установки в любом месте.
Исходя из вашего пояснения, кажется, что local :: lib может работать для вас в отдельных простых случаях, но я делаю это для промышленного развертывания, где я настраиваю индивидуальные, частные CPAN для каждого приложения и устанавливаю непосредственно из этих пользовательских CPANs. См., Например, мой модуль MyCPAN :: App :: DPAN . Исходя из этого, я использую пользовательские конфиги CPAN.pm, которые анализируют их среду и устанавливают правильные значения, чтобы каждое приложение могло устанавливать все в каталоге только для этого приложения.
Вы также можете рассмотреть возможность распространения вашего приложения в качестве Task ::. Вы устанавливаете его как любой другой модуль Perl, но зависимости используют ту же настройку (т.е. INSTALL_BASE).