如何将Perl应用程序作为单个文件分发?

时间:2009-09-12 18:27:38

标签: perl distribution

我有一个Perl脚本(foo.pl),使用require机制从同一目录加载Foo.pm:

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 个答案:

答案 0 :(得分:5)

如果您有兴趣将Perl脚本打包成包含所依赖的所有模块的二进制文件,可以使用PAR Packager

pp -o binary_name foo.pl

答案 1 :(得分:4)

文件可以包含多个包。先把你的班级,然后是主要的脚本:

package Foo::Bar;

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

#...

package main;

my $foo = Foo::Bar->new();
print ref $foo;  # Foo::Bar

答案 2 :(得分:3)

您的代码不起作用(尽管说明您收到的错误消息会有所帮助),因为您在定义之前尝试使用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
}

加法:

答案 3 :(得分:2)

总体方案是用您要求的内容替换您的“要求......”。除此之外还有更多(可能需要BEGIN {}),而且我不确定所涉及的内容。当然,你想要自动化它。

这是另一种选择:生成一个可执行文件,其中依赖的模块使用PAR/pp

打包在其中

答案 4 :(得分:2)

你已经有了一些很好的答案。此外,可以创建一个模块,而不是直接作为脚本运行。

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.
}

有关其他详细信息,请参阅brian d foy的How a Script Becomes a Module