我正在将继承的软件集转换为基于Module::Build的发行版。
除lib
文件外,.pm
目录还包含模块所需的某些外部文件。通过.pm
的{{1}}方法,可以轻松确保将具有扩展名的文件与Module::Build
文件一起复制。
但我对如何处理没有扩展名的文件感到困惑。如何在安装期间确保这些文件也与add_build_element
文件一起复制?有没有办法告诉.pm
在Module::Build
下复制所有内容?
答案 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');
只是一种可能的方法。我希望它可能符合你的详细要求。