2011-03-30 45 views
6

我正在將繼承的軟件集合轉換爲基於Module::Build的發行版。如何確保使用Module :: Build安裝沒有擴展名的文件?

除了.pm文件之外,lib目錄還包含模塊所需的某些外部文件。通過使用Module::Buildadd_build_element方法,很容易確保將具有擴展名的文件與.pm文件一起復制。

但我對如何處理沒有擴展名的文件感到困惑。如何確保這些文件在安裝過程中也與.pm文件一起復制?有沒有辦法告訴Module::Build複製的一切根據lib

+9

+1爲Perl的問題:) – 2011-03-30 21:00:15

回答

4

Build.PL

use lib 'inc'; 
use Local::Module::Build::Extensionless; 

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

INC /本地/模塊/編譯/ Extensionless.pm

package Local::Module::Build::Extensionless; 
use parent 'Module::Build'; 
use File::Next qw(); 

sub process_lib_files { 
    my ($self) = @_; 
    my $files; 

    { 
     my $iter = File::Next::files('lib'); 
     while (defined(my $file = $iter->())) { 
      $files->{$file} = $file; 
     } 
    } 

    # following piece from Module::Build::Base::process_files_by_extension 
    while (my ($file, $dest) = each %$files) { 
     $self->copy_if_modified(from => $file, to => File::Spec->catfile($self->blib, $dest)); 
    } 
}; 
1; 

但爲什麼這麼複雜?你真的想要share_dir

3

如果這些是模塊特定的數據文件; lib/Acme/Foo/Bar.pm所擁有的數據通常放在lib/auto/Acme/Foo/Bar /中,這是一個有些模糊的約定。

包括Module :: Build在內的大多數打包程序都應該遵守這個約定,並自動將其視爲「數據有效載荷」並將其與模塊文件一起打包。

有一些幫助模塊,包括File::ShareDir,可以幫助您在運行時查找數據。

use File::ShareDir; 
my $data_dir = File::ShareDir::module_dir('Acme::Foo::Bar'); 

只是一種可能的方法。我希望它可能適合您的詳細要求。

+2

'File :: ShareDir'在其他情況下是一個很好的解決方案,但它不適合我的情況。謝謝。 – 2011-03-31 02:50:17

+0

使用'File :: ShareDir'是正確的答案。很遺憾,思南沒有詳細說明他爲什麼認爲這不適合他的需要。 – Ether 2013-04-29 14:29:38