2011-03-10 44 views
3

我正在使用Module :: Build(儘管我在構建環境中很靈活)打包了一些perl軟件,工作。它包括一些腳本和一些輔助模塊。我的計劃是讓它可以在構建過程中指定任何你想要的東西的前綴(即,在perl的默認@INC之外的東西),並且構建的腳本應該仍然能夠毫無問題地找到它們的幫助器模塊。打包perl應用程序,以便它將在perl的默認前綴之外工作

我想這樣做,因爲我想用「ENCAP」,這是一個打包工具,默認情況下可以在/ usr /本地外安裝任何內部分發本軟件,並且是在RedHat,我們的Perl默認情況下不搜索/ usr/local/lib模塊。

這給我留下了一個機會,告訴用戶每次他們想要運行應用程序時手動將PERL5LIB設置爲/ usr/local/lib,或者使用構建系統對其進行智能化處理,指定了--prefix之後的腳本的use lib行。

現在我只是設置use lib直接指向/ usr/local/lib在我的每個腳本中手動,但我真的不喜歡作爲解決方案。主要是因爲測試過程:我想在測試過程中覆蓋@INC,以便它首先使用我的工作目錄用於perl模塊,但在構建之後,應該從@INC中刪除工作目錄,並用用戶指定的前綴替換。但也因爲我希望這個軟件可以安裝到任意位置(比如它自己的小島在NFS上有自己的bin /和lib/dirs),並且仍然可以正常工作。

問題

CAN模塊::打造讓我在構建步驟與我的劇本use lib線擺弄?我注意到MakeMaker有一個pm_filter選項,可以讓你指定一個搜索和替換,它可以隨意修改你的.pm文件,但它只適用於.pm文件,而不是腳本。模塊::構建應該是更靈活,但我淹沒在文件試圖找出你指定的地方。

回答

3
>>> [email protected]:/tmp/Foo-Bar$ tree 
. 
├── bin 
│ └── foobar 
├── Build.PL 
├── inc 
│ └── Local 
│  └── Module 
│   └── Build 
│    └── Fnord.pm 
└── lib 
    └── Foo 
     └── Bar.pm 

7 directories, 4 files 

>>> [email protected]:/tmp/Foo-Bar$ cat bin/foobar 
use lib "DUMMY"; 
use Foo::Bar; 
print "It works!\n"; 

>>> [email protected]:/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; 

>>> [email protected]:/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; 

>>> [email protected]:/tmp/Foo-Bar$ cat lib/Foo/Bar.pm 
package Foo::Bar; 
1; 

>>> [email protected]:/tmp/Foo-Bar$ perl Build.PL --install_base=/tmp/usr/local 
⋮ 

>>> [email protected]:/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 

>>> [email protected]:/tmp/Foo-Bar$ cat blib/script/foobar 
use lib "/tmp/usr/local/lib/perl5"; 
use Foo::Bar; 
print "It works!\n"; 

>>> [email protected]:/tmp/Foo-Bar$ cd /tmp/usr/local/bin/ 

>>> [email protected]:/tmp/usr/local/bin$ perl foobar 
It works! 
+0

非常好!我在發佈這篇文章後正在研究Module :: Build的子類,並且在我離開工作之前差不多有那麼一段時間。我試圖弄清楚如何從process_bin_files子文件中獲取剛創建的文件的名稱,但我猜想它可以像任何事情一樣好用。謝謝! – 2011-03-11 01:57:01

相關問題