2011-03-30 8 views
6

मैं एक विरासत सॉफ्टवेयर संग्रह को Module::Build आधारित वितरण में परिवर्तित कर रहा हूं।मैं कैसे सुनिश्चित कर सकता हूं कि मॉड्यूल :: बिल्ड का उपयोग करके एक्सटेंशन के बिना फ़ाइलें इंस्टॉल की गई हैं?

lib निर्देशिकाओं में .pm फ़ाइलों के अलावा, मॉड्यूल द्वारा आवश्यक कुछ बाहरी फ़ाइलों के अलावा, निर्देशिका शामिल है। Module::Build की add_build_element विधि का उपयोग कर .pm फ़ाइलों के साथ एक्सटेंशन वाले लोगों को यह सुनिश्चित करना आसान है कि .pm फ़ाइलें हैं।

लेकिन मैं उन फ़ाइलों से निपटने के बारे में उलझन में हूं जिनके पास कोई एक्सटेंशन नहीं है। मैं यह सुनिश्चित कैसे कर सकता हूं कि इंस्टॉलेशन के दौरान .pm फ़ाइलों के साथ उन फ़ाइलों को भी कॉपी किया गया है? के तहत सब कुछ कॉपी करने के लिए Module::Build बताने का कोई तरीका है?

+9

+1 10k पर्ल प्रश्न होने के लिए :) –

उत्तर

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; 

इंक/स्थानीय/मॉड्यूल/निर्माण/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/में रखा जाता है।

मॉड्यूल :: बिल्ड सहित अधिकांश पैकर्स इस सम्मेलन का सम्मान करना चाहिए और स्वचालित रूप से इसे "डेटा पेलोड" के रूप में मानना ​​चाहिए और इसे मॉड्यूल फ़ाइलों के साथ पैकेज करना चाहिए।

File::ShareDir आप रनटाइम पर डेटा का पता लगाने में मदद कर सकते समेत कुछ सहायक मॉड्यूल नहीं है।

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

बस एक संभावित दृष्टिकोण। मुझे उम्मीद है कि यह आपकी विस्तृत आवश्यकताओं के अनुरूप हो सकता है।

+2

'फ़ाइल :: ShareDir' अन्य परिस्थितियों में एक अच्छा समाधान है, लेकिन यह मेरे मामले में उपयुक्त नहीं है। धन्यवाद। –

+0

'फ़ाइल :: शेयरडियर' का उपयोग करना सही जवाब है। यह एक दयालु है सिनन ने विस्तार से यह नहीं बताया कि उसने क्यों सोचा कि यह उसकी जरूरतों के लिए अनुपयुक्त था। – Ether

संबंधित मुद्दे

 संबंधित मुद्दे