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

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

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

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


ИЗМЕНИТЬ добавление на основе ответов на данный момент:

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

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

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

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


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


РЕДАКТИРОВАТЬ - Par выглядит многообещающим для чистого Perl, хотя такая же сделка, она не рассчитана на решить проблему кросс-платформенной компиляции для собственных расширений


person Ville M    schedule 20.02.2009    source источник


Ответы (7)


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

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

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

person brian d foy    schedule 20.02.2009
comment
Почему вы разрабатываете на Cygwin? Это тоже цель? , ответ - да, я бы хотел, чтобы эти приложения также запускались в Windows, и кажется, что проще всего придерживаться cygwin в Windows, так как он больше всего похож на unix. - person Ville M; 24.02.2009
comment
На какую архитектуру вы ориентируетесь (RISC, SPARC, Intel и т. Д.). По какой-то причине в этой организации сложно достать машины для разработки Unix. Архитектура HP UX - RISC2.0. Я должен проверить солярис. Есть ли бесплатная виртуальная машина, которая будет работать на Windows XP для HP ux / Solaris? Рекомендации? - person Ville M; 24.02.2009
comment
Зачем вам нужна бесплатная виртуальная машина? Потратьте 100 долларов и сэкономьте много времени. - person brian d foy; 24.02.2009
comment
В любом случае, что вы посоветуете за 100 долларов? - person Ville M; 24.02.2009
comment
Мне нравится ваш подход, и я пытаюсь установить целую локальную иерархию, как вы объяснили. У меня возникла проблема с настройкой нового локального домашнего Perl, поэтому я добавил здесь вопрос: stackoverflow.com/questions/588559/ - person Ville M; 26.02.2009

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

person daotoad    schedule 20.02.2009
comment
+1 Я использовал это в прошлом, и это избавляет от многих головных болей. - person bsruth; 21.02.2009
comment
Интересно, я надеялся на бесплатную альтернативу, но я посмотрю. Я предполагаю, что perl2exe делает что-то, чего не делает PAR? - person Ville M; 24.02.2009
comment
Я не уверен, как perl2exe выполняет кросс-компиляцию. Я предполагаю, что IndigoStar предоставляет любые необходимые общие библиотеки для любой платформы и объединяет их в пакет вместе с исполняемым файлом загрузчика. Не уверен на 100%. Обратитесь в службу поддержки Indigo и спросите их об этом. - person daotoad; 24.02.2009

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

Теперь вопрос: есть ли у вас доступ к компилятору на этом компьютере Solaris? Не потому, что у вас нет корневого доступа, вы не можете скомпилировать и установить модули 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, например:

perl -I $HOME script.pl

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

use lib $ENV{'HOME'};
person Pierre-Luc Simard    schedule 20.02.2009
comment
Я только что понял, что до сложных вещей, другой unix - это HP, так что я получил и то, и другое. Родная проблема. У него есть компилятор, cc - это HP-UX C compiler.c89, но не уверен, насколько хорошо он будет работать. Также нет команды cpan, а perl старый. Это perl, v5.6.1 для PA-RISC2.0. Может ли c89 скомпилировать cpan? - person Ville M; 20.02.2009
comment
CPAN - это модуль Perl, вы должны запускать его как один. Таким образом perl -MCPAN -e shell. Это должно привести вас к cpan> приглашению. - person Jack M.; 20.02.2009
comment
Если вы умеете компилировать модули, вы также должны уметь компилировать сам Perl. Использование одних и тех же аргументов для команды configure на каждой платформе даст вам еще большую совместимость. - person innaM; 20.02.2009
comment
Если у вас действительно не установлен CPAN, вы всегда можете установить модули по старинке: скачать, tar xzf module.tgz, cd module, perl Makefile.PL PREFIX = $ HOME, make install - person Mathieu Longtin; 20.02.2009
comment
Этот, perl -MCPAN -e shell;, действительно работал. Но я не могу заставить его что-либо установить. Запуск гласит: Пожалуйста, установите Net :: FTP как можно скорее. Но если я запустил это в соответствии с рекомендациями: cpan ›install Bundle :: libnet Can't exec --decompress ... Похоже, ящик не может получить доступ за пределами atall - person Ville M; 21.02.2009
comment
Я думаю, вы имели в виду -I вместо -l, который указывает значение символа конца строки. Я уже починил для вас :) - person brian d foy; 21.02.2009
comment
PREFIX будет здесь немного проблемой, потому что он создаст каталоги архива, в которых будут отображаться скомпилированные биты. Вы также должны добавить их в свой @INC. INSTALL_BASE может быть лучше. - person brian d foy; 21.02.2009
comment
Хорошо, я медленно получаю cpan, работающий над ящиком hpux, одна проблема заключалась в отсутствии gzip, поэтому мне потребовалось время, чтобы найти двоичный файл, потому что он не компилировался, тогда мне пришлось скомпилировать wget, а также правильно установить порт прокси. Я не пытаюсь установить PAR, но, похоже, он зависает при выполнении тестов. предстоящие обновления - person Ville M; 25.02.2009

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

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

person kmkaplan    schedule 20.02.2009
comment
Хорошо, только что нашел этот faq.perl.org/perlfaq8.html#How_do_I_keep_my_own, но это не решает проблему собственной компиляции - person Ville M; 20.02.2009

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

person GeorgeM    schedule 20.02.2009

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

person singingfish    schedule 20.02.2009
comment
Я не заметил, что cpan на Cygwin работает медленно. Вы можете объяснить, что вы имеете в виду? - person brian d foy; 21.02.2009
comment
На самом деле это ответ на пользовательский отчет о некоторой документации, которую я написал. Похоже, что на слегка недооцененном устройстве разработчика при использовании cygwin все работает гораздо медленнее, чем на моем iBook G4 с неадекватными характеристиками (512 МБ оперативной памяти), поэтому мои доказательства на данном этапе анекдотичны. - person singingfish; 22.02.2009
comment
Если это анекдотично, можете ли вы тогда удалить комментарий в своем ответе? Я рад реагировать на проблемы с моим программным обеспечением и ожидаю, что люди будут говорить правду и поддерживать. - person brian d foy; 21.01.2010
comment
Мой комментарий на самом деле не совсем необоснованный, он исходит из боли, которую пережил мой многострадальный технический обозреватель, устанавливая Catalyst и сопутствующие материалы для моей книги. - person singingfish; 01.02.2010

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

  1. Создайте папку с именем lib в корне вашего проекта (например: ~ / projects / MyProject / lib)
  2. Любые модули, которые вы загружаете с CPAN, должны иметь Makefile, а также каталог с именем «lib». Скопируйте содержимое папки lib во вновь созданную папку lib. Некоторые модули могут содержать только один файл .pm без структуры библиотеки. Просто скопируйте файл .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 для модуля и посмотрите, что он делает.

person Tequila Jinx    schedule 20.02.2009
comment
Не просто копирование каталога lib. Соберите модуль, а затем используйте вместо него содержимое blib. - person brian d foy; 21.02.2009