Как я могу убедиться, что файлы без расширений устанавливаются с помощью Module::Build?

Я конвертирую унаследованную коллекцию программного обеспечения в дистрибутив на основе Module::Build.

lib каталоги содержат, в дополнение к .pm файлы, определенные внешние файлы, необходимые модулям. Легко убедиться, что те, которые имеют расширения, копируются вместе с .pm файлы с помощью Module::Build"s add_build_element метод.

Но я не совсем понимаю, как обращаться с файлами, которые не имеют расширений. Как я могу убедиться, что эти файлы также скопированы вместе с .pm файлы во время установки? Есть ли способ сказать Module::Build скопировать все под lib?

2 ответа

Решение

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;

вкл /Local/ модуль /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;

Но почему так сложно? Вы действительно хотите share_dir.

Если это файлы данных конкретного модуля; есть несколько неясное соглашение о том, что данные, принадлежащие 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');

Просто один из возможных подходов. Я надеюсь, что это может соответствовать вашим детальным требованиям.

Другие вопросы по тегам