經過大量關於物品組,目標和複印任務的閱讀後,我已經想出瞭如何去做我所需要的。
<ItemGroup>
<FilesToCopy Include="..\**\app.template.config">
<NewFilename>app.config</NewFilename>
</FilesToCopy>
<FilesToCopy Include="..\**\web.template.config">
<NewFilename>web.config</NewFilename>
</FilesToCopy>
<FilesToCopy Include"..\Hibernate\hibernate.cfg.template.xml">
<NewFilename>hibernate.cfg.xml</NewFilename>
</FilesToCopy>
</ItemGroup>
<Target Name="CopyFiles"
Inputs="@(FilesToCopy)"
Outputs="@(FilesToCopy->'%(RootDir)%(Directory)%(NewFilename)')">
<Message Text="Copying *.template.config files to *.config"/>
<Copy SourceFiles="@(FilesToCopy)"
DestinationFiles="@(FilesToCopy->'%(RootDir)%(Directory)%(NewFilename)')"/>
我創建一個包含我要複製的文件的項目組。 **運算符告訴它遍歷整個目錄樹來查找具有指定名稱的每個文件。然後,我爲每個名爲「NewFilename」的文件添加一段元數據。這是我將重命名每個文件。
這段代碼加在指定app.template.config目錄結構的每個文件,並指定我將命名新文件的app.config:
<FilesToCopy Include="..\**\app.template.config">
<NewFilename>app.config</NewFilename>
</FilesToCopy>
我然後創建一個目標複製所有的文件。該目標最初非常簡單,只調用複製任務以便始終複製和覆蓋文件。我傳遞FilesToCopy項目組作爲複製操作的來源。我使用transforms來指定輸出文件名,以及我的NewFilename元數據和衆所周知的項目元數據。
以下片段將例如將文件c:\ Project \ Subdir \ app.template.config轉換爲c:\ Project \ Subdir \ app。配置和複製前者向後者:
<Target Name="CopyFiles">
<Copy SourceFiles="@(FilesToCopy)"
DestinationFiles="@(FilesToCopy->'%(RootDir)%(Directory)%(NewFileName)')"/>
</Target>
但後來我發現,開發者可能不希望有他定製的web.config文件被過度編寫的所有腳本運行時間。然而,如果存儲庫的web.template.config已被修改,開發人員可能會應該覆蓋他的本地文件,並且現在具有代碼需要的新值。我嘗試了許多不同的方法 - 使用「Exist()」函數將Copy屬性「SkipUnchangedFiles」設置爲true,但無濟於事。
對此的解決方案是building incrementally。這可確保只有在app.template.config更新時纔會覆蓋文件。我通過文件作爲目標輸入的名字,我指定新的文件名作爲目標輸出:
<Target Name="CopyFiles"
Input="@(FilesToCopy)"
Output="@(FilesToCopy->'%(RootDir)%(Directory)%(NewFileName)')">
...
</Target>
這樣做的目標檢查,看是否電流輸出上最新與尊重到輸入。如果不是,即特定的.template.config文件比其對應的.config文件具有更新的更改,則它會將web.template.config複製到現有的web.config上。否則,它將使開發人員的web.config文件保持原樣並保持不變。如果沒有指定的文件需要被複制,那麼目標被完全跳過。在乾淨的存儲庫克隆後立即複製每個文件。
上述結果是一個令人滿意的解決方案,因爲我只開始使用MSBuild,而且我對它強大的功能感到驚訝。我不喜歡的唯一的事情就是我必須在兩個地方重複完全相同的變換。我討厭重複任何形式的代碼,但我無法弄清楚如何避免這種情況。如果任何人有小費,將不勝感激。另外,雖然我認爲開發實踐需要這樣做,但這確實有助於緩解這種吸引因素。
爲什麼配置文件沒有簽到?您能提供一些特定於開發人員(並且不能共享)的配置設置的示例嗎? –
據我所知,沒有使用無法共享的設置。但是開發人員可能想要更改連接字符串,以便他可以對本地數據庫執行所有測試。我可以告訴你,當前的過程很糟糕,因爲項目文件仍然期望有一個web.config文件,這增加了我不得不做的所有工作的手動工作量。 –
整個團隊(只有3或4個開發人員,直到我加入)似乎沒有現狀的問題,因爲開發人員似乎對特定項目擁有很大的所有權,甚至可能不會構建其他'。因此,他們只處理單個項目文件,而不是像我創建的主解決方案那樣。 –