2011-05-25 33 views
5

我已經定義了一個叫做版本C#項目屬性作爲團隊市環境變量來覆蓋項目屬性

<Version Condition="$(Version)==''">1.2.3.4<Version> 

1.2.3.4是默認值。

我有一個團隊城市系統屬性,也被稱爲版本,設置爲覆蓋。因此,在Team City的自定義運行對話框中,我可以爲Version指定一個值,並使用該值。這工作正常。

但是,如果我在Team City中保留參數空白,則默認值仍會被空白(空?)覆蓋。如果我刪除Team City參數,則使用默認值。

條件不正確?我如何才能將Team City屬性設置爲空白,並且只有在輸入某個值時才能覆蓋它?

回答

6
OP的評論後

更新答案:

從文檔:

的MSBuild允許您設置使用 /屬性或/ p命令行開關在命令行屬性 。 從 命令行收到的屬性值會覆蓋項目文件中設置的屬性值 和從環境 繼承的值的變量值 。

所以你可以設置一個屬性$(VersionTC)在TeamCity的配置,並檢查該屬性是否爲空,並設置版本

<Version>$(VersionTC)<Version> 
<Version Condition="'$(VersionTC)'==''">1.2.3.4<Version> 

(所以你設置VersionVersionTC第一。然後看如果它清空並設置默認值)

看看這個blog post解釋所有這一切。


嘗試類似如下:

<Version Condition=" '$(Version)'=='' ">1.2.3.4<Version> 

注意' '(單引號)圍繞$(Version)

+0

謝謝,這似乎沒有幫助 – jbemt48 2011-05-25 22:15:36

+0

@Spider M9 - 這只是爲了清楚。你沒有注意到額外的''''周圍的$(版本)? – manojlds 2011-05-26 00:01:25

+0

@ jbemt48 - 我已經更新了我的回答 – manojlds 2011-05-26 00:27:32

4

團隊市大概還在傳遞參數在命令行上,只是一個空值,如在,

/p:Version="" 

或東西si milar。您看到的症狀是由於MSBuild如何處理重寫的屬性。在命令行中指定時,屬性將採用該值,而不管它是否也在靜態(文件中的全局,不在目標中)中聲明PropertyGroup聲明。因此,您的版本聲明,條件被檢查爲空字符串,將被完全跳過。

解決此問題的一個方法是將包含$(版本)聲明的PropertyGroup及其條件移入目標中,並在其中首次使用它。 MSBuild將允許從目標中的運行時創建的「動態」屬性覆蓋命令行屬性的值。

如果您運行此命令行...

> msbuild My.proj /t:Ver /p:Version="" 

...而這個目標......

<Target Name="Ver"> 
    <PropertyGroup> 
    <Version Condition="'$(Version)' == ''">1.2.3.4<Version> 
    </PropertyGroup> 
    <Message Text="Version: '$(Version)'" /> 
</Target> 

...你會得到版本顯示1.2.3.4,而如果PropertyGroup在目標之外,它將保留空值。

+0

,如果您移動到目標範圍內,即使您使用,它也不會工作。查看我更新的答案 – manojlds 2011-05-26 00:29:03

+0

在目標中移動PropertyGroup是現在(幾乎)過時的CreateProperty任務的4.0等效語法。它會工作,嘗試它! – 2011-05-26 01:35:56