Как я могу создать переносимый Perl, когда я не могу установить модули на целевой хост? - PullRequest
12 голосов
/ 20 февраля 2009

Мне нужно запускать приложения Perl, которые я разрабатываю в Cygwin Windows, на хостах HP unix / Solaris. Я не являюсь суперпользователем на компьютерах с Unix и не могу коснуться расположения модулей Perl по умолчанию и не могу установить модули в расположение модулей Perl по умолчанию. Также в установке unix отсутствуют большинство основных модулей, и я не могу это изменить.

Например, у меня есть Perl-приложение, которому требуется Expect , в котором есть собственные скомпилированные C-части. Как бы я развернул это приложение в Unix с его необходимыми зависимостями, не устанавливая ничего другого на этот ящик?

Есть ли способ собрать все приложение Perl под Windows Cygwin, а затем просто развернуть один исполняемый файл для Unix и запустить его из моего домашнего каталога?


РЕДАКТИРОВАТЬ добавление на основе ответов на данный момент:

В частности, благодаря Брайану , локальное решение LIB dir, кажется, работает в случае нативного Perl, но в случае, когда модулю Perl требуются компоненты C, кросс-платформенная компиляция, то есть компиляция для запуска на cygwin Солярис, не реально возможно, как я боялся.

Однако, поможет ли установка другой linux, то есть будет ли это проще для разных версий Unix, таких как пакет Perl для linux, а затем для развертывания в Solaris / HP? А что-то вроде lcc ?

Кроме того, я все еще хотел бы услышать немного больше, если кто-то развернул собственный пакет Perl для Windows, который включает в себя все зависимости для сложного приложения Perl, которое затем может быть перемещено в unix как один файл? (Теперь я понимаю, что он не будет работать, если встроенный C-код включен, как в Expect.pm, но как насчет того, чтобы использовать только модули perl?)

В основном по многим причинам я пытаюсь свести к минимуму время, необходимое для входа на эти «производственные» хосты Unix и заранее сделать как можно больше локально.


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


EDIT - Par выглядит многообещающе для чистого Perl, хотя та же сделка не решает проблему кросс-платформенной компиляции для собственных расширений

Ответы [ 7 ]

12 голосов
/ 21 февраля 2009

В этом случае я бы подумал о том, чтобы поставить полное приложение с собственным Perl. Вы можете выбрать любую понравившуюся вам версию и любые понравившиеся вам модули. Скомпилируйте все, организуйте все в каталог, а затем смонтируйте результат Для развертывания скопируйте файл и распакуйте. Воспользуйтесь советом, который уже отмечали другие, о путях поиска в библиотеке и т. Д. По сути, ваше приложение получает собственный стек.

Теперь уловка заключается в кросс-компиляции. Почему вы разрабатываете на Cygwin? Это тоже цель? Есть ли причина, по которой у вас нет машины разработки HP / UX или Solaris? На какую архитектуру вы ориентируетесь (RISC, SPARC, Intel и т. Д.). Если вы не можете получить аппаратное обеспечение для их запуска, приобретите несколько виртуальных машин для ваших целей и развивайтесь там.

Кроме того, вы можете устанавливать модули в любом месте, где у вас есть разрешения. См. perlfaq8 :

3 голосов
/ 21 февраля 2009

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

3 голосов
/ 20 февраля 2009

Компиляция сценария Perl со всеми его зависимостями от Windows с помощью Cygwin и его запуск Solaris просто не будут работать.

Теперь вопрос: есть ли у вас доступ к компилятору на этом компьютере Solaris? Не потому, что у вас нет root-прав, вы не можете скомпилировать и установить модули Perl в свой домашний каталог, используя:

perl Makefile.PL PREFIX=$HOME

Если в вашей системе Solaris имеется CPAN, вы можете установить префикс в оболочке CPAN следующим образом:

  1. запустить оболочку perl -MCPAN -e shell;
  2. изменить префикс с помощью conf makepl_arg PREFIX=/path/to/your/home/directory

Для запуска сценария вы можете запустить perl с помощью ключа командной строки -I $HOME, например ::11017*

perl -I $HOME script.pl

Другой вариант - разместить это в начале вашего сценария.

use lib $ENV{'HOME'};
2 голосов
/ 21 февраля 2009

Я сталкивался с этим несколько раз в своих рабочих системах. У нас есть базовая установка Perl 5.8, и у меня нет возможности добавлять модули. Вот решение, которое я использую:

  1. Создайте папку с именем 'lib' в вашем корень проекта (например: ~ / projects / MyProject / lib)
  2. Любой модули, которые вы загружаете из CPAN должен иметь Makefile, а также каталог под названием "lib". Скопируйте содержимое папки lib в вашу только что созданную папку lib. Некоторые модули могут содержать только один файл .pm и не иметь структуры lib. Просто скопируйте файл .pm.

Ваш код должен выполнять следующие действия: сначала используйте все модули, которые были установлены нормально, затем отмените переменную среды @INC, чтобы использовать локальные библиотеки:

# Declare Includes --------------------------------------------------------------------------------
use Getopt::Long;
use vars qw($VERSION);
use DirHandle;
use FileHandle;


# Force perl to use our local 'lib' directory for imported modules, this allows us to
# use modules without having to install them in th emain perl assembly. However, this
#also prevents these modules from being used in other projects.
BEGIN { unshift @INC, "lib"; }
use Error qw(:try);
use SOAP::Transport::HTTP;
#use LWP::Protocol::https;
use XML::Simple;
use XML::Writer;
use XML::Writer::String;

Предупреждение этого метода заключается в том, что некоторые модули Perl не используют метод 'lib' или не имеют дополнительных зависимостей. Если вы столкнетесь с проблемами, проверьте Makefile.PL для модуля и посмотрите, что он делает.

2 голосов
/ 21 февраля 2009

Вам понадобится local :: lib . Как только вы это сделаете, чистые модули Perl должны работать кроссплатформенно, но вам придется идентифицировать и переустановить скомпилированные модули на сторонней платформе. Выполните первоначальную установку на реальном Unix, Cpan на Cygwin работает медленно.

2 голосов
/ 21 февраля 2009

Если у вас есть компилятор в каждой из ваших систем (и некоторые другие инструменты, необходимые для настройки, например, grep), вы должны не только иметь возможность компилировать модули, но и создавать собственные исполняемые файлы perl.

2 голосов
/ 20 февраля 2009

Установите переменную окружения PERLLIB в личный каталог Perl lib или используйте переключатель командной строки -I для Perl, чтобы указать ее.

Если у вас есть доступ к компьютеру HP-UX, вы можете скомпилировать Expect и установить его в свой каталог. Но кросс-компиляция из Windows в HP-UX, вероятно, намного сложнее. Вам придется создать кросс-компилятор GCC.

...