Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Использование CPAN-модулей без установки


Автор: Lvovich2011 10.10.2011, 00:56
Здравствуйте.
Есть Perl-система: интернет-магазин.
Каждый купивший ее клиент вынужден обращаться к своему хостеру и давать заявку на установку дополнительных Perl-модулей.
Да и со стандартными модулями у многих хостеров наблюдается определенный бардак.
У клиента, разумеется, нет никаких прав и знаний об установке модулей.

Хочется сделать так, чтобы система не зависела от того, какой дистрибутив Perl и в каком объеме установлен у хостера.
Т.е., например, устанавливается система в cgi-bin, внутри директория lib, где расположены необходимые модули.

Скажите, возможно ли использовать CPAN-модули без установки, а просто накачать со CPAN, развернуть в lib и прописать в скрипте 
Код

use 'lib';
 ???

Тогда установка упростится, у клиента просто разворачивается архив, и система готова к работе "из коробки".
Мечты, конечно, но реализуемы вполне.
Одна затычка - не удается все необходимые библиотеки так подцепить.
Например, при попытке использования Crypt::SSLeay возникает ошибка
Код

Can't locate loadable object for module Crypt::SSLeay in @INC

А при использовании MIME::Base64 без установки ошибка
Код

MIME::Base64 object version 3.07 does not match bootstrap parameter 3.13 at /usr/local/lib/perl5/5.8.8/mach/DynaLoader.pm line 253.


Есть ли варианты решения данной проблемы? Буду очень благодарен за помощь!

Автор: gcc 10.10.2011, 01:01
есть PAR:
http://search.cpan.org/search?mode=all&query=par

Автор: taryk 10.10.2011, 01:24
MIME::Base64 - стандартный модуль который уже есть в системе.
Crypt::SSLeay содержит xs который нужно скомпилировать.

Автор: Lvovich2011 10.10.2011, 08:08
Цитата(taryk @ 10.10.2011,  01:24)
MIME::Base64 - стандартный модуль который уже есть в системе.
Crypt::SSLeay содержит xs который нужно скомпилировать.

Вы не подскажете, как скомпилировать? Я с nix не работал на таком уровне :(
И еще: компиляция - это привязка к ОС, да? Или нет?
Просто, цель у меня - сделать так, чтобы в директории lib были рабочие библиотеки, которые не требуют допиливания при развороте у клиента.
Библиотеки такие: SOAP::Lite, Crypt::SSLeay.

Автор: arto 10.10.2011, 11:40
1. обычно все опиано в README или INSTALL
2. компиляция -- привязка к конкретной архитектуре, конкретной версии perl и конкретной версии библиотеки
3. проще вам нанять специалиста, слишком много нетривиальных вопросов надо вам будет решить.

Автор: Lvovich2011 10.10.2011, 12:38
Цитата(arto @ 10.10.2011,  11:40)
1. обычно все опиано в README или INSTALL
2. компиляция -- привязка к конкретной архитектуре, конкретной версии perl и конкретной версии библиотеки
3. проще вам нанять специалиста, слишком много нетривиальных вопросов надо вам будет решить.

Получается, я должен по-любому сделать:
1. Скопировать необходимые библиотеки в любую директорию
2. запустить необходимые процедуры установки (возможно, makefile.pl - с prefix='cgi-bin/lib')

Т.е., простое копирование библиотек в мой директорию lib может не дать нормальной работы (останется конфликт версий или отсутствие загружаемых объектов, или еще что-нибудь...).

Жаль, конечно :(
Хотелось сделать так, чтобы не пришлось устанавливать библиотеки...

Автор: shamber 10.10.2011, 13:03
не пользуйтесь теми, что XS и все.

Автор: Lvovich2011 11.10.2011, 10:34
Цитата(shamber @ 10.10.2011,  13:03)
не пользуйтесь теми, что XS и все.

К сожалению, вынужден использовать.
Задача - сопряжение наших данных с Яндекс Директом посредством API Директа.
Для этого нужны библиотеки:
SOAP::Lite
Crypt::SSLeay
LWP::UserAgent

С хостерами клиентов при этом постоянно возникают проблемы: то не установлено, то версия старая.

Вот и возникла идея "тащить" эти библиотеки с собой. Т.е., мы разворачиваем клиенту свой дистрибутив в cgi-bin, и все нужные библиотеки уже есть и берутся из cgi-bin/lib с помощью директивы use 'lib'. Остальные библиотеки - стандартные, у всех хостеров есть в Perl-е.
Если бы удалось подцепить эти три библиотеки, то требования к зоне значительно снизились бы.

Может, все-таки, есть вариант решения данной задачи?

Автор: taryk 11.10.2011, 11:46
Цитата(Lvovich2011 @  10.10.2011,  07:08 Найти цитируемый пост)
И еще: компиляция - это привязка к ОС, да? Или нет?


Чтобы обеспечить кроссплатформенность - нужно скомпилировать под каждую платформу (linux-x86, linux-amd64, solaris-x86, solaris-sparc, freebsd-x86, etc) и подгружать нужный модуль в зависимости от платформы.

смотрите в сторону http://search.cpan.org/~smueller/PAR-1.002/lib/PAR.pm

Автор: Lvovich2011 13.10.2011, 07:28
Цитата(taryk @  11.10.2011,  11:46 Найти цитируемый пост)
Чтобы обеспечить кроссплатформенность - нужно скомпилировать под каждую платформу (linux-x86, linux-amd64, solaris-x86, solaris-sparc, freebsd-x86, etc) и подгружать нужный модуль в зависимости от платформы.


О! Это - последняя капля! Что ж , не судьба, значит, использовать CPAN-модули в своей директории + директиву use 'lib'
Тогда, думаю, просто обрежем базовую версию системы, уберем из нее несколько режимов, требующих CPAN-модулей с компиляцией XS.

А насчет PAR: мне уже qcc здесь же его предлагал. Смысл? По-моему, любая разархивация упакованного кода увеличивает время запуска и требования к памяти. А, если Perl-система достаточно велика, да еще и число входов на сайт большое, потери будут также очень велики.
Но, если имелось в виду архивировать с помощью PAR только откомпилированные CPAN-модули, то я уже сказал: скорее всего, мы откажемся от этой идеи :(

Всем, кто помог мне прояснить ситуацию, большое спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)