2011-07-20 7 views
4

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

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

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

+0

私はこれも深刻な問題を抱えていました。私たちがそれについて何をしたかを見るために、私は掘り下げなければなりませんでした。あなたがプライベートでそれについて話したいのであれば、私はすべての詳細を公開することができないので、私に知らせてください。 –

+0

@brian:オファーに感謝します。私はあなたにそれを取り上げません(回避策を見つけました:私はツールをクリーンで削除しないように強制します)が、この回避策が失敗した場合にはもう少し時間がかかります。 –

答えて

4

いいえ、設定可能なオプションではありません。これはModule::Build::Basecopy_if_modified方法で行われています:

# 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をサブクラス化し、ファイルを書き込み可能にする基本クラスを呼び出してから、chmodするcopy_if_modifiedをオーバーライドすることができます。しかし、他の人のモジュールをインストールしようとしているという印象を受けます。

おそらく最も簡単なことは、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のカスタマイズ版を使うことができますが、別の手順をとる方が簡単かもしれません。

+0

あなたは確かにcopy_if_modifiedはblib /にコピーするだけではありませんか?私は実際のインストールはExtUtils :: Install(実行ビットがソースに設定されている場合は0444(+0111)のハードコード)で実行されると思いますが、確かめる前にコードを見落としました。 – ysth

+0

これは私の調査が主導したところで、確認のおかげです! –

関連する問題