Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打包perl应用程序,使其在perl';s默认前缀_Perl_Packaging_Software Distribution - Fatal编程技术网

打包perl应用程序,使其在perl';s默认前缀

打包perl应用程序,使其在perl';s默认前缀,perl,packaging,software-distribution,Perl,Packaging,Software Distribution,我正在使用Module::Build(尽管我在构建环境上很灵活)打包我正在编写的一些perl软件,供我工作的地方内部使用。它包括一些脚本和一些助手模块。我的计划是,在构建过程中,您可以指定任何您想要的前缀(即perl的默认值@INC)并且构建的脚本应该仍然能够找到它们的帮助器模块,而不会出现任何问题 我之所以要这样做,是因为我想用“Encap”在内部分发这个软件,这是一个打包工具,默认情况下不能在/usr/local之外安装任何东西,并且在RedHat上,我们的perl默认情况下不会搜索/usr

我正在使用Module::Build(尽管我在构建环境上很灵活)打包我正在编写的一些perl软件,供我工作的地方内部使用。它包括一些脚本和一些助手模块。我的计划是,在构建过程中,您可以指定任何您想要的前缀(即perl的默认值
@INC
)并且构建的脚本应该仍然能够找到它们的帮助器模块,而不会出现任何问题

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

这就让我有机会告诉用户,每次他们想要运行应用程序时,都要手动将
PERL5LIB
设置为/usr/local/lib,或者对构建系统进行一些智能化操作,让它在指定
--前缀后处理每个脚本的
use lib

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

问题


Module::Build是否允许我在构建步骤中摆弄脚本的
使用lib
行?我注意到MakeMaker有一个pm_过滤器选项,允许您指定搜索和替换,可以在生成.pm文件时任意修改它们,但这只适用于.pm文件,而不适用于脚本。模块::构建应该更加灵活,但我正沉浸在文档中,试图找出您应该在哪里指定它。

非常好!在我发布这篇文章之后,我正在研究子类化Module::Build,在我离开工作日之前,我已经做了很多。我试图弄清楚如何从process_bin_files子文件中获取刚构建的文件名,但我猜globbing它的效果和其他任何东西一样好。谢谢
>>> 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!