VERSION

Version 0.10

ПРИВЕТСТВИЕ SALUTE

Доброго всем! Доброго здоровья! Доброго духа!

Hello all! Nice health! Good thinks!

NAME

lib::remote - Удаленное использование модулей. Загружает модули с удаленного сервера. Только один диспетчер в @INC- push @INC, sub {...};. Диспетчер возвращает filehandle для контента, полученного удаленно. Смотреть perldoc -f require.

lib::remote - pragma for use remote modules without installation basically throught protocols like http. One dispather on @INC - push @INC, sub {}; This dispather will return filehandle for downloaded content of a module from remote server. See perldoc -f require.

Идея из "http://forum.codecall.net/topic/64285-perl-use-modules-on-remote-servers/"

Кто-то еще стырил "http://www.linuxdigest.org/2012/06/use-modules-on-remote-servers/" (поздняя дата и есть ошибки)

FAQ

Q: Зачем? Why?

A: За лосем. For elk.

Q: Почему? And why?

A: По кочану. For head of cabbage.

Q: Как?

A: Да вот так.

SYNOPSIS

Все просто. По аналогии с локальным вариантом:

use lib '/to/any/local/lib';

указываем урл:

use lib::remote 'http://<хост(host)>/site-perl/.../';
use My::Module1;
...

Искомый модуль будет запрашиваться как в локальном варианте, дописывая в конце URL: http://<хост(host)>/site-perl/.../My/Module1.pm

Допустим, УРЛ сложнее, не содержит имени модуля или используются параметры: https://<хост>/.../?key=ede35ac1208bbf479&...

Тогда делаем пары ключ->значение, указывая КОНКРЕТНЫЙ урл для КОНКРЕТНОГО модуля, например:

use lib::remote
    'Some::Module1'=>'https://<хост>/.../?key=ede35ac1208bbf479&...',
    'SomeModule2'=>'ssh://user:pass@host:/..../SomeModule2.pm',
;
#use Some::Module1; не нужно, уже сделано require (см. "Опцию [require] расширенного синтаксиса")
use SomeModule2 qw(func1 func2), [<what ever>, ...];# только, если нужно что-то импортировать очень сложное (см. "Опцию [import] расширенного синтаксиса")
use parent 'Some::Module1'; # такое нужно
...

Внимание

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

При многократном вызове use lib::remote все параметры и урлы сохраняются, аналогично use lib '';, но естественно не в @INC. Повторюсь, в @INC помещается только один диспетчер.

Расширенный синтаксис

use lib::remote
    # global config for modules unless them have its own
    'http://....',
    ['http://....', opt1 =>..., opt2 =>..., ....],
    {url=>'http://....', opt1 =>..., opt2 =>..., ....},

# per module personal options
    'Some::Module1'=> 'http://....',
    'Some::Module2'=>['http://...', opt1 =>..., opt2 =>..., ....],
    'Some::Module3'=>{url => 'http://...', opt1 =>..., opt2 =>..., ....},
    'SomeModule1'=>['ssh://user@host:/..../SomeModule2.pm', 'pass'=>..., ...],
    'SomeModule2'=>{url => 'ssh://user@host:/..../SomeModule2.pm', 'pass'=>..., ...},
;
...

Не трудно догадаться, что вычленение пар в общем списке происходит по специфике URI.

Опции:

  • url => '>schema://>...' Это основной параметр. На уровне глобальной конфигурации сохраняется список всех урлов, к которым добавляется путь Some/Module.pm

  • charset => 'utf8', Задать кодировку урла. Если веб-сервер правильно выдает Content-Type: ...; charset=utf8, тогда не нужно, ->decoded_content сработает. Помнить про use utf8;

  • require => 1|0 Cрабатывает require Some::Module1; Поэтому не нужно делать строку use|require Some::Module;, если только нет хитрых импортов (см. опцию import ниже)

  • import => [qw(), ...]. The import spec for loaded module. Disadvantage!!! Work on list of scalars only!!! Просто вызывается Some::Module1->import(...);

  • cache => 1|0 Content would be cached

  • debug => 0|1 warn messages

  • что еще?

Можно многократно вызывать use lib::remote ...; и тем самым изменять настройки модулей и глобальные опции.

Требования REQUIRES

Если урлы 'http://...', 'https://...', 'ftp://...', 'file://...', то нужен LWP::UserAgent

Если 'ssh://...' - TODO

Url может возвращать сразу пачку модулей (package). В этом случае писать ключом один модуль и дополнительно вызывать use для остальных модулей.

EXPORT

Ничего не экспортируется.

SUBROUTINES/METHODS

Только внутренние.

Пример конфига для NGINX, раздающего модули:

...
server {
    listen       81;
#        server_name  localhost;


    location / {
        charset utf-8;
        charset_types *;
        root   /home/perl/lib-remote/;
        index  index.html index.htm;
    }

}
...

AUTHOR

Mikhail Che, <m[пёсик]cpan.org>

BUGS

Please report any bugs or feature requests to bug-lib-remote at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=lib-remote. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

You can find documentation for this module with the perldoc command.

perldoc lib::remote

You can also look for information at:

ACKNOWLEDGEMENTS

Не знаю.

SEE ALSO

Глянь PAR

Глянь Remote::Use

Глянь lib::http

Глянь lib::dbi

LICENSE AND COPYRIGHT

Copyright 2012-2013 Mikhail Che.

This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.

DISTRIB

$ module-starter --module=lib::remote --author=”Mikhail Che” --email=”m.che@cpan.org" --builder=Module::Build --license=perl --verbose

$ perl Build.PL

$ ./Build test

$ ./Build dist