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

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

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

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

Ответы [ 2 ]

4 голосов
/ 31 марта 2011

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;

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

3 голосов
/ 31 марта 2011

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

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

...