Подтвердить что ты не робот

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

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

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

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


Добавление EDIT на основе ответов до сих пор:

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

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

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

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


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


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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

perl Makefile.PL PREFIX=$HOME

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

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

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

perl -I $HOME script.pl

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

use lib $ENV{'HOME'};

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Вам понадобится local::lib. После того, как вы это сделали, чистые модули Perl должны работать с перекрестной платформой, но вам придется идентифицировать и переустановить скомпилированные модули на чужой платформе. Сделайте первоначальную установку на реальном unix, cpan на cygwin работает медленно.

Ответ 7

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

  • Создайте папку под названием 'lib' в своем корень проекта (например: ~/projects/MyProject/lib)
  • Любые модулей, загружаемых из 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 для модуля и посмотрите, что он делает.