打包perl应用程序,使其在perl的默认前缀之外工作

时间:2011-03-10 22:21:27

标签: perl packaging software-distribution

我正在使用Module :: Build(尽管我在构建环境上很灵活)来打包一些我正在编写的perl软件供我内部使用。它包括一些脚本和一些辅助模块。我的计划是让它在构建过程中指定你想要的任何前缀(即perl的默认@INC之外的东西),并且构建的脚本应该仍然能够找到他们的帮助模块而没有任何问题

我想这样做是因为我想在内部使用“Encap”分发这个软件,这是一个打包工具,默认情况下不能在/ usr / local之外安装任何东西,并且正在打开RedHat,默认情况下我们的perl不会在/ usr / local / lib中搜索模块。

这让我有可能告诉用户每次想要运行应用程序时手动将PERL5LIB设置为/ usr / local / lib,或者使用构建系统做一些智能操作来获取它在指定use lib后,调整每个脚本的--prefix行。

现在我只是将use lib设置为在我的每个脚本中手动指向/ usr / local / lib,但我并不是真的喜欢它作为解决方案。主要是因为测试过程:我想在测试期间覆盖@INC,以便它首先使用我的工作目录用于perl模块,但是在构建时,工作目录应该从@INC中删除并替换为用户指定的前缀。但也因为我希望将这个软件安装到任意位置(例如它自己的小岛上的某个地方,带有自己的bin /和lib / dirs),并且仍可正常工作。

问题

Module :: Build是否允许我在构建步骤中摆弄脚本的use lib行?我注意到MakeMaker有一个pm_filter选项,允许你指定一个搜索和替换,它可以在构建它们时随意修改.pm文件,但这只适用于.pm文件,而不是脚本。 Module :: Build应该更灵活,但我在文档中淹没,试图找出你指定的位置。

1 个答案:

答案 0 :(得分:3)

>>> daxim@champion:/tmp/Foo-Bar$ tree
.
├── bin
│   └── foobar
├── Build.PL
├── inc
│   └── Local
│       └── Module
│           └── Build
│               └── Fnord.pm
└── lib
    └── Foo
        └── Bar.pm

7 directories, 4 files

>>> daxim@champion:/tmp/Foo-Bar$ cat bin/foobar
use lib "DUMMY";
use Foo::Bar;
print "It works!\n";

>>> daxim@champion:/tmp/Foo-Bar$ cat Build.PL
use lib 'inc';
use Local::Module::Build::Fnord;

my $build = Local::Module::Build::Fnord->new(
    module_name => 'Foo::Bar',
    license     => 'restricted',
);
$build->add_build_element('bin');
$build->create_build_script;

>>> daxim@champion:/tmp/Foo-Bar$ cat inc/Local/Module/Build/Fnord.pm
package Local::Module::Build::Fnord;
use parent 'Module::Build';
sub process_bin_files {
    my ($self) = @_;
    my $lib = $self->install_base . '/lib/perl5';
    system "chmod u+w blib/script/*";
    my $call = qq($^X -p -i -e's[use lib "DUMMY";][use lib "$lib";]' blib/script/*);
    print "$call\n";
    system $call;
};
1;

>>> daxim@champion:/tmp/Foo-Bar$ cat lib/Foo/Bar.pm
package Foo::Bar;
1;

>>> daxim@champion:/tmp/Foo-Bar$ perl Build.PL --install_base=/tmp/usr/local
⋮

>>> daxim@champion:/tmp/Foo-Bar$ ./Build install
Building Foo-Bar
/home/daxim/local/bin/perl -p -i -e's[use lib "DUMMY";][use lib "/tmp/usr/local/lib/perl5";]' blib/script/*
Installing /tmp/usr/local/lib/perl5/Foo/Bar.pm
Installing /tmp/usr/local/bin/foobar

>>> daxim@champion:/tmp/Foo-Bar$ cat blib/script/foobar
use lib "/tmp/usr/local/lib/perl5";
use Foo::Bar;
print "It works!\n";

>>> daxim@champion:/tmp/Foo-Bar$ cd /tmp/usr/local/bin/

>>> daxim@champion:/tmp/usr/local/bin$ perl foobar
It works!