2011-03-30 9 views
6

Estoy convirtiendo una colección heredada de software en una distribución basada en Module::Build. Los directorios lib contienen, además de los archivos .pm, ciertos archivos externos que necesitan los módulos. Es fácil asegurarse de que los que tienen extensiones se copian junto con los archivos .pm utilizando el método Module::Buildadd_build_element.¿Cómo puedo garantizar que los archivos sin extensiones estén instalados usando Module :: Build?

Pero estoy confundido acerca de cómo tratar con archivos que no tienen extensiones. ¿Cómo puedo asegurarme de que esos archivos también se copian junto con los archivos .pm durante la instalación? ¿Hay alguna manera de decirle a Module::Build que copie todo bajo lib?

+9

+1 por ser la pregunta de 10k Perl :) –

Respuesta

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/local/Módulo/Construir/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; 

Pero por qué tan complicado? Realmente quieres share_dir.

3

Si se trata de archivos de datos específicos del módulo; Existe una convención algo oscura de que los datos propiedad de lib/Acme/Foo/Bar.pm generalmente se colocan en lib/auto/Acme/Foo/Bar /.

La mayoría de los empaquetadores, incluido Module :: Build, deben respetar esta convención y automáticamente tratar esto como una "carga útil de datos" y empaquetarlo junto con los archivos del módulo.

Hay algunos módulos auxiliares que incluyen File::ShareDir que pueden ayudarlo a localizar los datos en tiempo de ejecución.

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

Solo un posible enfoque. Espero que se ajuste a tus requisitos detallados.

+2

'File :: ShareDir' es una buena solución en otras circunstancias, pero no es adecuada en mi caso. Gracias. –

+0

Usar 'File :: ShareDir' es la respuesta correcta. Es una pena que Sinan no explicara por qué pensaba que no era adecuado para sus necesidades. – Ether

Cuestiones relacionadas