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

Есть ли что-нибудь эквивалентное или близкое по функциональности к Python virtualenv , но для Perl?

Я провел некоторые разработки на Python, и возможность установки несистемных версий модулей в отдельной среде без каких-либо проблем является огромным преимуществом. Теперь мне нужно поработать над новым проектом на Perl, и я ищу что-то вроде virtualenv, но для Perl. Можете ли вы предложить какой-нибудь Perl-эквивалент или замену для python's virtualenv?

Я пытаюсь настроить X различных наборов несистемных пакетов Perl для Y различных приложений, которые будут развернуты. Хуже того, для этих приложений могут потребоваться разные версии одного и того же пакета, поэтому для каждого из них может потребоваться установка в отдельную среду модуля / библиотеки. Возможно, вы захотите сделать это вручную для X 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

Ответы [ 8 ]

21 голосов
/ 15 сентября 2009

Существует инструмент под названием local::lib, который завершает всю работу за вас, очень похоже на virtualenv. Это будет:

  • Установите @INC в процессе, в котором он используется.
  • Установить PERL5LIB и другие подобные вещи для дочерних процессов.
  • Установите правильные переменные, чтобы убедить CPAN, MakeMaker, Module::Build и т. Д. Для установки библиотек и сохранения конфигурации в локальном каталоге.
  • Установите PATH, чтобы можно было найти установленные двоичные файлы.
  • Выводить переменные среды в стандартный вывод при использовании из командной строки, чтобы вы могли поставить eval $(perl -Mlocal::lib) в вашем .profile, а потом в основном забывают об этом.
2 голосов
/ 20 апреля 2016

Во время расследования я обнаружил эту и некоторые другие страницы ( эта слишком старая и пропускает новые технологии, эта публикация reddit является небольшим заблуждением ).

Проблема с perlbrew и plenv заключается в том, что они кажутся заменой для pyenv, а не virtualenv. Как уже отмечалось, здесь pyenv для управления версиями Python, virtualenv для управления версиями модулей для каждого проекта. Так что да, в некотором роде похож на local :: lib , но с лучшей практичностью.

Я еще не видел правильного ответа на этот вопрос, но из того, что я прочитал, похоже, что лучшее решение - это что-то вроде:

  • Управление версиями Perl: plenv / perlbrew (с большинством людей в пользу более современного blen основанного plenv по сравнению с perl perlbrew из того, что я вижу)
  • Управление версиями модуля: Коробка
  • Установка модуля: cpan (ну, cpanminus в любом случае, ymmv)

Если честно, это не идеальная установка, хотя я все еще учусь, так что она все же может быть лучше. Это просто не правильно. Это, конечно, не похоже на замену virtualenv .

Я нашел несколько постов, в которых говорится: " it is возможных ", но ни один не пошел дальше.

1 голос
/ 04 июля 2014

Также извлекайте perl-virtualenv , похоже, что это обертка вокруг local :: lib, как предложено Хоббсом, но создает bin / activ и bin / deactivate, так что вы можете использовать его так же, как инструмент python .

Я пользуюсь им довольно успешно в течение месяца или около того, даже не осознавая, что он не был таким стандартом, как, возможно, и должно быть.

Это значительно упрощает настройку работающего virtualenv для perl, поскольку local: lib сообщит вам, какие переменные вам нужно установить, и т. Д. Perl-virtualenv создаст скрипт активации, который сделает это за вас.

1 голос
/ 15 сентября 2009

Я использовал schroot для этой цели. Это немного тяжелее, чем virtualenv, но вы можете быть уверены, что ничего не просочится в то, что не должно.

Schroot управляет средой chroot для вас, но монтирует ваш домашний каталог в chroot, так что он выглядит как обычный сеанс оболочки, просто используя двоичные файлы и библиотеки в chroot.

Я думаю, что это может быть только Debian / Ubuntu.

После настройки schroot ваш скрипт будет выглядеть как

schroot -c my_perl_dev
wget ...

См. http://www.debian -administration.org / Articles / 566 для интересной статьи об этом

1 голос
/ 15 сентября 2009

Я не уверен, совпадает ли это с тем, о чем вы говорите, virtualenv, но посмотрите на специальную переменную @INC в справочной странице perlvar.

1 голос
/ 15 сентября 2009

Программы могут изменять, какие каталоги они проверяют на наличие библиотек с use lib. Этот каталог lib может быть относительно текущего каталога. Библиотеки из этих каталогов будут использоваться перед системными библиотеками, так как они размещаются в начале массива @INC.

Я считаю, что cpan также может устанавливать библиотеки в определенные каталоги. Конечно, cpan рисует с сайта CPAN для установки, так что это может быть не лучшим вариантом.

0 голосов
/ 15 сентября 2009

Похоже, вам просто нужно использовать конфигурацию 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).

0 голосов
/ 15 сентября 2009

Что я делаю, так это запускаю оболочку CPAN (cpan) и устанавливаю из нее свой собственный Perl 5.10 (Я считаю, что команда установить Perl-5.10). Это попросит различные конфигурации настройки; Я должен указать путь к папке / usr / local (или другое место установки, отличное от стандартного).

Затем я помещаю его результирующее местоположение в свой исполняемый файл $ PATH перед стандартным perl и использую его оболочку CPAN для установки необходимых мне модулей (обычно много). Все мои Perl-скрипты начинаются со строки

#!/usr/bin/env perl

Никогда не было проблем с этим подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...