2011-07-20 69 views
4

我遇到了一個場景,我正在構建一個Perl模塊,作爲Windows機器上另一個Build系統的一部分。我使用Module :: Build的--install_base選項指定一個臨時目錄來放置模塊文件,直到整個構建系統都可以使用它們。不幸的是,如果其他文件系統依賴它的任何文件都是隻讀的,它會嘗試在重建它們之前刪除所有生成的文件,並且它不能清除任何只讀文件(它會嘗試刪除它,它是隻讀的,這會導致錯誤。)默認情況下,Module::Build將啓用只讀位來安裝庫。如何配置Module :: Build以不安裝文件爲只讀?

一種選擇是在構建過程中進行一個新步驟,即從已安裝文件中刪除只讀位,但由於構建工具的性​​質需要第二個臨時目錄......呃。

是否可以配置基於Module::Build的安裝程序在文件安裝到--install_base目錄時不啓用該只讀位?如果是這樣,怎麼樣?

+0

我也遇到過這方面的嚴重問題,我不得不回頭看看我們做了些什麼。如果你想私下談論它,因爲我無法公開所有的細節,請告訴我。 –

+0

@brian:謝謝你的提議;我現在不會把你帶上(找到解決辦法:我強制該工具不要在乾淨的環境中刪除它們),但如果此解決方法失敗,可能還需要一些時間。 –

回答

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的自定義版本,但只需要一個單獨的步驟可能會更容易。

+0

你確定copy_if_modified不只是用來複制blib /?我認爲實際的安裝是通過ExtUtils :: Install完成的(硬編碼0444(如果在源代碼中設置了任何執行位,則爲+0111)),但是我在放棄確定之前放棄了查看代碼。 – ysth

+0

這正是我調查所領導的地方,感謝您的確認! –