Как я могу установить специализированные среды для различных приложений Perl?

StackOverflow https://stackoverflow.com/questions/1423879

  •  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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top