Comment puis-je m'assurer que les fichiers sans extensions sont installés à l'aide de module :: build?

StackOverflow https://stackoverflow.com/questions/5491441

  •  14-11-2019
  •  | 
  •  

Question

Je convertit une collection de logiciels hérités en un Module :: build distribution basée.

La lib Les répertoires contiennent, en plus du .pm Fichiers, certains fichiers externes nécessaires aux modules. Il est facile de s'assurer que ceux qui ont des extensions sont copiés avec le .pm fichiers en utilisant Module::Build's add_build_element méthode.

Mais je suis confus sur la façon de gérer les fichiers qui n'ont aucune extension. Comment puis-je m'assurer que ces fichiers sont également copiés aux côtés du .pm Fichiers pendant l'installation? Y a-t-il un moyen de dire Module::Build copier tout en dessous de lib?

Était-ce utile?

La solution

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 / module / build / 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;

Mais pourquoi si compliqué? Tu veux vraiment share_dir.

Autres conseils

S'il s'agit de fichiers de données spécifiques au module; Il existe une convention quelque peu obscure que les données appartenant à Lib / ACME / FOO / BAR.PM sont généralement placées dans Lib / Auto / ACME / FOO / BAR /.

La plupart des packers, y compris le module :: build doivent respecter cette convention et le traiter automatiquement comme une "charge utile de données" et l'emballer avec les fichiers du module.

Il y a des modules d'assistance, y compris Fichier :: Sharedir Cela peut vous aider à localiser les données lors de l'exécution.

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

Juste une approche possible. J'espère que cela pourrait répondre à vos exigences détaillées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top