我正在将继承的软件集合转换为基于Module::Build的分发。
lib
除了文件之外,这些目录还包含.pm
模块所需的某些外部文件。.pm
使用Module::Build
'sadd_build_element
方法很容易确保将具有扩展名的文件与文件一起复制。
但是我对如何处理没有扩展名的文件感到困惑。如何确保.pm
在安装期间这些文件也与文件一起复制?有没有办法告诉Module::Build
复制下的所有内容lib
?
我正在将继承的软件集合转换为基于Module::Build的分发。
lib
除了文件之外,这些目录还包含.pm
模块所需的某些外部文件。.pm
使用Module::Build
'sadd_build_element
方法很容易确保将具有扩展名的文件与文件一起复制。
但是我对如何处理没有扩展名的文件感到困惑。如何确保.pm
在安装期间这些文件也与文件一起复制?有没有办法告诉Module::Build
复制下的所有内容lib
?
构建.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。
如果这些是模块特定的数据文件;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');
只有一种可能的方法。我希望它可能符合您的详细要求。