6

継承されたソフトウェア コレクションをModule::Buildベースのディストリビューションに変換しています。

libディレクトリには、ファイルに加えて、.pmモジュールに必要な特定の外部ファイルが含まれています。のメソッド.pmを使用して、拡張子を持つファイルがファイルと一緒にコピーされるようにするのは簡単です。Module::Buildadd_build_element

しかし、拡張子のないファイルの扱い方に戸惑っています。これらのファイルも.pmインストール中にファイルと一緒にコピーされるようにするにはどうすればよいですか? 下のすべてModule::Buildをコピーするように指示する方法はありますか?lib

4

2 に答える 2

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/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');

考えられるアプローチは1つだけです。それがあなたの詳細な要件に合うことを願っています。

于 2011-03-30T20:56:49.713 に答える