2010-02-19 133 views
10

我們在VS2008中使用.NET 3.5。我有一個約20個項目的解決方案,隨着應用程序的增長和增加新的模塊,這個數字將隨着時間的推移而增長。今天我需要爲每個項目設置一個屬性。我不得不編輯每個文件的csproj中加入如下:MSBuild - 爲解決方案設置屬性

<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文件,而不是單個項目。

回答

14

您可以在單個文件中指定此屬性和所有其他常用屬性,並通過在項目文件中包含Import語句來加載它。這就是我們在我們的構建環境中所做的工作,它有220個構建項目和多個共享項目文件(例如「分支」)。它運作良好。

+2

我喜歡這個解決方案,但它仍然意味着項目文件需要至少編輯一次。 – Mafuba 2010-02-21 20:51:48

+1

@Mafuba我已使用NuGet自動執行此操作。 – 2014-04-03 09:12:53

+0

如果共享道具文件被稱爲「Directory.Build.props」,那麼使用VS 2017將自動導入到目錄層次結構中的所有項目中。 – 2017-08-01 06:12:25

1

由於解決方案文件不是MSBuild文件,您將無法執行此類操作。您唯一的選擇就是處理它或使用主msbuild文件來代替構建解決方案文件。一種選擇可能是創建一個特殊的配置,供您的構建過程使用。對於解決方案文件,您可以指定使用的配置。

7

我已經實施了@ fatcat111建議的解決方案。這一次我通過使用NuGet - Common.Props自動執行了這個過程。該軟件包將在解決方案級別添加一個通用的道具文件,並通過將該軟件包安裝在同一解決方案的多個項目中,可以共享這些屬性。

該代碼在GitHub

相關問題