MSBuild - 為解決方案設置屬性
我們使用 .NET 3.5 和 VS2008。我有一個包含大約 20 個項目的解決方案,隨著應用程序的增長和添加新模組,這個數字會隨著時間的推移而增長。今天我需要為每個項目設置一個屬性。我必須編輯每個 csproj 文件以添加以下內容:
<Target Name="BeforeBuild"> <CreateProperty Condition=" '$(SolutionDir)' != '' And '$(SolutionDir)' != '*Undefined*' " Value="$(SolutionDir)Tools\MSBuild"> <Output TaskParameter="Value" PropertyName="AlToolPath" /> </CreateProperty> </Target>這是為了使項目能夠找到儲存在我的源儲存庫中的程序集連結器 (AL.exe),以便建構與機器無關(可以在任何具有 .NET 的機器上簽出和建構,而無需安裝 SDK)。該解決方案是由開發人員使用 MSBuild 在命令行上建構的,安裝批處理文件、CCNet 等。
無論如何,我尋找了一種更好的方法來做到這一點(即類似解決方案級別的屬性),但找不到。我知道可以在 MSBuild 命令行中設置屬性值,但這對我來說不能很好地擴展,因為所有現有和未來的命令行都必須包含它。我還考慮過在第一個建構的項目中呼叫 before 目標來使用自定義任務來設置環境變數,並在最後一個項目中呼叫 after 目標來刪除它,但這似乎比單獨編輯所有項目文件更沉重和脆弱.
請讓我知道您是否做過類似的事情,或者知道一種方法可以為每個解決方案設置一次屬性,該解決方案可以被多個項目使用(包括我沒有經驗的 .NET 4/VS2010)。請記住,我們使用 MSBuild 來建構 sln 文件,而不是單個項目。
您可以在單個文件中指定此屬性和所有其他常見屬性,並通過在項目文件中包含Import語句來載入它。這就是我們在建構環境中所做的事情,它有 220 個建構項目和多個共享項目文件(例如,“分支”)。它運作良好。
我現在已經多次實施**@fatcat111**建議的解決方案。這次我使用NuGet - Common.Props自動化了這個過程。該包將在解決方案級別添加一個通用道具文件,並且通過將包安裝在同一解決方案的多個項目中,可以共享屬性。
程式碼在GitHub 上。