Comment puis-je m'assurer que les fichiers sans extensions sont installés à l'aide de module :: build?
-
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
?
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.