如何确保使用Module :: Build安装没有扩展名的文件?

时间:2011-03-30 19:44:13

标签: perl module-build

我正在将继承的软件集转换为基于Module::Build的发行版。

lib文件外,.pm目录还包含模块所需的某些外部文件。通过.pm的{​​{1}}方法,可以轻松确保将具有扩展名的文件与Module::Build文件一起复制。

但我对如何处理没有扩展名的文件感到困惑。如何在安装期间确保这些文件也与add_build_element文件一起复制?有没有办法告诉.pmModule::Build下复制所有内容

2 个答案:

答案 0 :(得分: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 /本地/模块/建造/ 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

答案 1 :(得分:3)

如果这些是特定于模块的数据文件;有一个模糊的约定,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');

只是一种可能的方法。我希望它可能符合你的详细要求。