4

Windows マシン上の別のビルド システムの一部として Perl モジュールをビルドしているシナリオに遭遇しました。Module::Buildのオプションを使用して、--install_baseビルド システム全体で使用できるようになるまで、モジュール ファイルを配置する一時ディレクトリを指定します。残念ながら、依存するファイルのいずれかが読み取り専用である場合、その他のビルド システムには問題があります。生成されたファイルを再構築する前に削除しようとし、読み取り専用ファイルを消去できません (削除しようとします)。 、読み取り専用であり、エラーが発生します。) デフォルトでModule::Buildは、読み取り専用ビットを有効にしてライブラリをインストールします。

1 つのオプションは、ビルド プロセスで、インストールされたファイルから読み取り専用ビットを削除する新しいステップを作成することですが、ビルド ツールの性質上、2 つ目の一時ディレクトリが必要になります。

Module::Buildファイルが --install_base ディレクトリにインストールされるときに、その読み取り専用ビットを有効にしないようにベースのインストーラーを構成することは可能ですか? もしそうなら、どのように?

4

1 に答える 1

4

いいえ、構成可能なオプションではありません。copy_if_modifiedのメソッドで行われModule::Build::Baseます:

# mode is read-only + (executable if source is executable)
my $mode = oct(444) | ( $self->is_executable($file) ? oct(111) : 0 );
chmod( $mode, $to_path );

Build.PL を制御している場合は、サブクラス化Module::Buildしてオーバーライドcopy_if_modifiedし、基本クラスを呼び出してからchmodファイルを書き込み可能にすることができます。しかし、あなたは他の誰かのモジュールをインストールしようとしているだけの印象を受けます。

おそらく最も簡単な方法は、 のコピーをModule::Buildプライベート ディレクトリにインストールし、それを編集して使用することoct(666)です (または任意のモードで使用します)。次に、 を呼び出しperl -I /path/to/customized/Module/Build Build.PLます。または、(あなたが言ったように)標準を使用してModule::Build、別のステップを追加して、後ですべてを書き込み可能にマークします。

更新: ysth は正しいです。実際に最終コピーを行う のはExtUtils::Installです。copy_if_modifiedは入力用blibです。しかし、ExtUtils::Install はモードを読み取り専用にハードコーディングします。ExtUtils::Install のカスタマイズされたバージョンを使用することもできますが、別のステップを用意する方がおそらく簡単です。

于 2011-07-21T00:01:25.363 に答える