Как я могу распространять свое приложение Perl в виде одного файла? - PullRequest
5 голосов
/ 12 сентября 2009

У меня есть Perl-скрипт (foo.pl), который загружает Foo.pm из того же каталога, используя механизм require:

require "./Foo.pm";
...
my $foo = new Foo::Bar;

Foo.pm придерживается стандартного формата модуля:

package Foo::Bar;
...
1;

Вместо того, чтобы распространять мое приложение в виде двух файлов (foo.pl и Foo.pm), я хотел бы распространять только один файл. В частности, я хотел бы сделать Foo.pm частью скрипта foo.pl.

Как мне этого добиться?

Тривиальный подход простого объединения двух файлов (cat foo.pl Foo.pm> foo2.pl) не работает.

Ответы [ 5 ]

5 голосов
/ 13 сентября 2009

Если вы заинтересованы в упаковке скрипта Perl в двоичный файл со всеми модулями, от которых он зависит, вы можете использовать PAR Packager :

pp -o binary_name foo.pl
4 голосов
/ 12 сентября 2009

Файл может содержать несколько пакетов. Сначала укажите ваш класс, а затем основной сценарий:

package Foo::Bar;

sub new { 
  my $class = shift;
  return bless {}, $class;
}

#...

package main;

my $foo = Foo::Bar->new();
print ref $foo;  # Foo::Bar
3 голосов
/ 12 сентября 2009

Ваш код не работал (хотя было бы полезно указать полученные сообщения об ошибках), потому что вы пытались использовать Foo :: Bar до того, как он был определен. Попробуйте это:

use strict;
use warnings;
my $foo = Foo::Bar->new();
# more code...

# end code

# begin definitions
BEGIN {
    package Foo::Bar;
    use strict;
    use warnings;
    # definitions...
    1;

    package Foo::Baz;
    # more stuff, if you need to define another class
}

Дополнения:

2 голосов
/ 13 сентября 2009

У вас уже есть несколько хороших ответов. Кроме того, можно создать модуль, который можно запустить непосредственно в виде скрипта.

package Foo;

__PACKAGE__->run(@ARGV) unless caller();

sub run {
    # Do stuff here if you are running the Foo.pm as
    # a script rather than using it as a module.
}

Дополнительные сведения см. В статье Брайана Д Фоя Как скрипт становится модулем .

2 голосов
/ 12 сентября 2009

Общая схема будет состоять в том, чтобы заменить ваше «требование ...» содержимым того, что вам требуется. Это больше, чем это (BEGIN {} может понадобиться), и я не совсем уверен, в чем дело. Конечно, вы хотели бы автоматизировать это.

Вот альтернатива: создайте один исполняемый файл, в котором модули, от которых вы зависите, упакованы внутри него, используя PAR / pp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...