2009-08-09 57 views
2

由於我開始爲我們的項目使用MSBuild,因此我創建了幾個.proj腳本,這些腳本由我們存儲庫中的多個項目共享。所有這些共享腳本都駐留在一個目錄中。如何創建MSBuild .proj文件的公共存儲庫?

到目前爲止,我已經提到的共享腳本使用相對路徑,像這樣:

<MSBuild Projects="..\..\common\build\MyScriptA.proj" Properties="ABC=XYZ"/> 

然而,每一個項目還進口了共同.proj腳本,像這樣:

<Import Project="..\..\common\build\CommonImports.proj"/> 

其中<Import>是幾個其他的東西,並定義了一些屬性。

今天早上我想我可以用一個變量替換相對路徑,可能是$(CommonDir),這個變量可以通過導入上面提到的CommonImports.proj來定義。這將使我打電話的共同任務是這樣的:

<MSBuild Projects="$(CommonDir)\MyScriptA.proj" Properties="ABC=XYZ"/> 

但是,我不能想出一個辦法,以這樣的方式,以使其在所有其他的MSBuild腳本導入工作,以確定此$(CommonDir)變量不管他們的位置如何,都可以使用CommonImports.proj

This question提供了幾種創建包含相對路徑絕對路徑的屬性的方法,但如果我所做的全部操作都是<Import>定義該屬性的腳本,則這些方法都不起作用。

問題1:我對MSBuild相當陌生;有沒有更好的方法來創建可重複使用的.proj腳本的「庫」,我可以通過<MSBuild>任務運行?我知道$(MSBuildExtensionsPath),但是我希望常見任務駐留在我的結帳中,以便我們的生成計算機在執行結帳時自動獲取最新版本的常見任務。

問題2:如何定義$(CommonDir)CommonImports.proj,以使其包含於含有CommonImports.proj目錄的絕對路徑?

+0

你是怎麼打電話給MSBuild的?這是NAnt任務嗎?如果你不使用NAnt,你能用它來幫助你嗎?如果您使用NAnt,請完全忽略我。 – 2009-08-24 11:34:57

+1

不使用NAnt,也不想使用NAnt的解決方案。 – 2009-08-24 21:23:01

回答

1

以下是對我們最有效的方法。

首先,檢入所有可重用的東西到VCS中的/common/build/目錄中。

然後,添加一個/common/build/CommonImports.proj,看起來像這樣:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     ToolsVersion="4.0"> 
    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 
    <Import Project="ILMerge.proj"/> 
    <Import Project="Mage.proj"/> 
    <Import Project="InnoSetup.proj"/> 
    <UsingTask TaskName="RT.Tasks.AssemblyVersion" AssemblyFile="Tasks\Release\RT.Tasks.dll"/> 
    <UsingTask TaskName="RT.Tasks.WaitForProcessesToTerminate" AssemblyFile="Tasks\Release\RT.Tasks.dll"/> 
    <PropertyGroup> 
    <BuildSingleProj>$(Root)\common\build\BuildSingle.proj</BuildSingleProj> 
    </PropertyGroup> 
</Project> 

這將導入的幾個項目和任務,一切使用,並定義了一個由所有共享的屬性組。然後,在每一個構建腳本補充一點:

<PropertyGroup> 
    <Root>..\..</Root> 
    [... other global properties ...] 
</PropertyGroup> 
<Import Project="$(Root)\common\build\CommonImports.proj"/> 
2

我不知道如果你不應該把它的MSBuild的路徑:

例如,this project通過消耗:

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 

,並自動將自己安裝到:

{program files}\MSBuild\MSBuildCommunityTasks 

所以也許定義你自己的特定的子文件夾,並從那裏使用?

<Import Project="$(MSBuildExtensionsPath)\romkyns\CommonImports.proj"/> 

等。由於$MSBuildExtensionsPath變量定義分開,你不應該有它很大的困難。也許。

+0

謝謝,的確我注意到msbuildtasks安裝在那裏。然而,我們的常見任務更改(至少現在)比msbuildtasks更頻繁 - 這就是爲什麼我正在尋找一種方法讓任務在結帳中被引用。作爲獎勵,如果我同步回到過去並調用構建,我將使用與發佈時相同的常見任務,而無需額外的麻煩。 – 2009-08-24 19:22:34

1

這不是一個詳細的答案,但這裏的一些筆記,當人們解決了這個問題一般都是非常有用的。所有需要MSBuild 4.0或更高版本。

(1)$(MSBuildThisFile)屬性和類似的屬性。它允許導入的文件引用相對於自己的文件,而不是它們導入的項目。這會將它們與導入的項目分開。

(2)「GetDirectoryNameOfFileAbove」函數。見here。這個奇妙有用的功能使得項目可以導入他們不知道的位置的文件。將共享文件(或從某處導入其他文件的單個存根共享文件)放在源代碼樹頂部。然後在它下面的項目中使用這個函數來找到這個存根並導入它,因此也就是你所有的共享構建過程。

(3)導入標籤允許使用通配符。這使得可以導入文件 - 換言之,擴展構建過程 - 只需將其放入特定位置,然後編輯現有文件。