The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

VERSION

Version 0.11

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

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

Hello all! Nice health! Good thinks!

NAME

lib::remote - pragma, functional and object interface for load and use/require modules from remote sources without installation basically throught protocols like http (LWP). One dispather on @INC - push @INC, sub {}; This dispather will return filehandle for downloaded content of a module from remote server.

lib::remote - Удаленная загрузка и использование модулей. Загружает модули с удаленного сервера. Только один диспетчер в @INC- push @INC, sub {...};. Диспетчер возвращает filehandle для контента, полученного удаленно. Смотреть 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 so why?

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

Q: Как? How?

A: Да вот так. Da vot tak.

SYNOPSIS

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

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

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

    # pragma interface at compile time
    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 помещается только один диспетчер.

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

Pragma variant

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

and 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'=>..., ...},
    ;

Functional variant - is runtime and you cant import symbols

    use lib::remote;
    my $conf = lib::remote->config('http://....');
    # DONT WORK -> lib::remote::module('Foo::');
    # OK
    lib::remote->module('Foo::One'=>'http://...', )::foo(...);
    

Object variant - is runtime and you cant import symbols

    use lib::remote;
    my $dispatcher = lib::remote->new(<list options>);
    my $foo2 = $dispatcher->module('Foo::Two')->new();

Опции Options

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

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

  • url_suffix

  • 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 ...; и тем самым изменять настройки модулей и глобальные опции.

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

EXPORT

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

SUBROUTINES/METHODS

This is runtime.

new(<options list>) Create lib::remote object and apply/merge options. All created objects are one variable.

module(<options list>) Try to load and require modules. Return the name of first parsed module in list of options.

config(<options list>) Apply/merge options to lib::remote package.

Требования REQUIRES

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

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

Пример конфига для 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

perldoc -f require.

Глянь 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