6

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

lib除了文件之外,这些目录还包含.pm模块所需的某些外部文件。.pm使用Module::Build'sadd_build_element方法很容易确保将具有扩展名的文件与文件一起复制。

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

4

2 回答 2

4

构建.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

于 2011-03-30T21:02:08.393 回答
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');

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

于 2011-03-30T20:56:49.713 回答