2009-09-14 1 views
21

Есть ли что-то эквивалентное или близкое с точки зрения функциональности для Python's virtualenv, но для Perl?Как установить специализированные среды для разных приложений Perl?

Я сделал некоторые разработки в Python и возможность иметь несистемные версии модулей, установленных в отдельной среде без каких-либо беспорядков, является огромным преимуществом. Теперь мне нужно работать над новым проектом в Perl, и я ищу что-то вроде virtualenv, но для Perl. Можете ли вы предложить любой эквивалент Perl или замену для виртуального виртуального 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 
+0

Не могли бы вы объяснить, что вы пытаетесь сделать? –

+0

Я пытаюсь настроить X различных наборов не-системных пакетов perl для Y различных приложений, которые будут развернуты. Хуже того, для этих приложений могут потребоваться разные версии одного и того же пакета, поэтому каждый из них может потребоваться установить в отдельной среде модуля/библиотеки. Вы можете сделать это вручную для X Y> X. Я искал инструмент, который бы автоматизировал и упрощал это, и кажется, что local :: lib - это именно тот инструмент. – abbot

+0

Я не думаю, что локальный :: lib - это то, что вы ищете. Если вы хотите, чтобы каждое приложение на одном хосте ничего не делило, оно не будет обрабатывать это для вас без большой работы. –

ответ

21

Существует инструмент под названием local::lib, который завершает всю работу для вас, как и virtualenv. Он будет:

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

'perlbrew' того стоит; http://perlbrew.pl –

1

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

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

+0

'@ LIB' ничего не делает. ITYM '@ INC' – hillu

+0

Я знаю об этих параметрах. Да, я знаю, я могу написать несколько простых скриптов для инициализации структуры среды и каталогов, я даже могу убедить CPAN использовать эту структуру каталогов, и я могу сделать много других интересных вещей. Но мне нужно сделать это вручную. Одной из ключевых особенностей virtualenv является то, что часть «без создания беспорядка». Он скрывает все эти низкоуровневые шаги настройки и значительно упрощает использование таких сред. Я ищу что-то подобное для Perl. Я просто не могу поверить, что этого не существует. – abbot

+0

@hillu: er ... wrops, braino с моей стороны. – Powerlord

1

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

0

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

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

#!/usr/bin/env perl 

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

+0

Установка собственного Perl не включена, если вам требуется 5-10 различных сред. – abbot

+1

Вы имеете в виду, что он не полностью автоматизирован? Да, это недостаток. Я уверен, что было бы легко автоматизировать (просто вопрос о том, как предоставить настройки конфигурации для установки Perl), но я этого не делал. – reinierpost

+0

BTW Я всегда устанавливаю программное обеспечение в подкаталог, зависящий от версии, а затем использую что-то вроде stow, чтобы символизировать одну версию в месте, которое находится на моем пути. Таким образом, я по-прежнему могу использовать определенные версии, когда это необходимо. – reinierpost

1

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

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

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

schroot -c my_perl_dev 
wget ... 

См http://www.debian-administration.org/articles/566 интересную статью об этом

0

Похоже, вам просто нужно использовать конфигурацию INSTALL_BASE для Makefile.PL (или опции --install_base для Build.PL)? Что именно вам нужно для решения? Похоже, вам просто нужно установить установленный модуль в нужное место. Вы представили свою проблему как XY Problem, указав то, что, по вашему мнению, является решением, а не позволяете нам помочь вам с вашей задачей.

См., Например, How do I keep my own module/library directory? в perlfaq8.

При загрузке модулей из CPAN, последней cpan команды (в App::Cpan) имеет -j переключатель, чтобы позволить вам выбрать другие файлы конфигурации CPAN.pm. В этих конфигурационных файлах вы можете установить параметры CPAN.pm для установки там, где вам нравится.

Основываясь на вашем пояснении, это звучит так, как локальный :: lib может работать для вас в простых простых случаях, но я делаю это для развертывания промышленной силы, где я настраиваю индивидуальные CPAN для каждого приложения и устанавливаю непосредственно из этих пользовательские CPAN. Например, см. Мой модуль MyCPAN::App::DPAN. Исходя из этого, я использую настраиваемые конфигурации CPAN.pm, которые анализируют их среду и устанавливают правильные значения для каждого приложения, могут устанавливать все в каталог именно для этого приложения.

Вы также можете рассмотреть возможность распространения приложения как задачи ::. Вы устанавливаете его, как и любой другой модуль Perl, но зависимости используют эту же настройку (то есть INSTALL_BASE).

+1

Я знаю обо всем этом, но он довольно низкоуровневый. Мне нужен инструмент, который может быстро выполнить все эти низкоуровневые шаги настройки/настройки для меня с помощью простой команды. Я знаю, что я представил это как проблему XY, но если вы проверите принятый ответ, вы обнаружите, что он работает почти так же, как я описал. Вы должны попробовать это решение самостоятельно, если вы еще не сделали этого. – abbot

+0

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

1

Также checkout perl-virtualenv, это, кажется, обертка вокруг локального :: lib, как предложено Hobbs, но создает bin/activate и bin/deactivate, поэтому вы можете использовать его так же, как инструмент python.

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

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

2

При исследовании я обнаружил эту и некоторые другие страницы (this one is too old и пропустил новые технологии, this reddit post is a slight misdirect).

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

Я не видел правильный ответ на этот вопрос пока нет, но от того, что я читал, это выглядит как лучшее решение что-то вдоль линий:

  • Perl управление версиями: plenv/perlbrew (с большинством людей благоприятствующих более современный Баш plenv основанный над Perl на основе perlbrew от того, что я могу видеть)
  • версия модуля управления: Carton
  • установка модуля: CPAN (ну, cpanminus любой путь, YMMV)

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

Есть несколько сообщений, которые я нашел, говоря «itispossible« но ни один из них не пошел дальше.

Смежные вопросы