我正在使用 Module::Build (尽管我在构建环境上很灵活)来打包我正在编写的一些 Perl 软件,供我工作的内部使用。它包括一些脚本和一些辅助模块。我的计划是这样你就可以指定任何你想要的前缀(即perl默认值之外的东西)@INC
)在构建过程中,构建的脚本应该仍然能够找到它们的帮助模块,没有任何问题。
我想这样做是因为我想用“Encap”在内部分发这个软件,这是一个打包工具,默认情况下可以not安装 /usr/local 之外的任何内容,并且在 RedHat 上,我们的 Perl 默认情况下不会在 /usr/local/lib 中搜索模块。
这让我有可能告诉用户手动设置PERL5LIB
每次他们想要运行应用程序时,都会到 /usr/local/lib ,或者对构建系统进行一些智能操作,让它摆弄每个脚本的use lib
后一行--prefix
已指定。
现在我只是设置use lib
在我的每个脚本中手动直接指向 /usr/local/lib ,但我不太喜欢将其作为解决方案。主要是因为测试过程:我想覆盖@INC
在测试期间,它首先使用我的工作目录作为 perl 模块,但是在构建后,应该从中删除工作目录@INC
并替换为用户指定的前缀。但也因为我希望这个软件可以安装到任意位置(例如 NFS 上的某个小岛,有自己的 bin/ 和 lib/ 目录)并且仍然可以正常工作。
问题:
Module::Build 可以允许我摆弄我的脚本吗?use lib
构建步骤期间的行?我注意到 MakeMaker 有一个 pm_filter 选项,允许您指定搜索和替换,可以在构建时任意修改 .pm 文件,但这仅适用于 .pm 文件,不适用于脚本。 Module::Build 应该更灵活,但我淹没在文档中试图找出你在哪里指定它。
>>> 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!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)