使用Team City环境变量覆盖项目属性

时间:2011-05-25 19:23:48

标签: msbuild teamcity

我有一个名为Version的C#项目属性,定义为

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

1.2.3.4是默认值。

我有一个Team City系统属性,也称为Version,设置为覆盖。因此,在Team City的自定义运行对话框中,我可以为Version指定一个值,并使用该值。这很好。

但是,如果我在Team City中将参数留空,则默认值仍会被空白覆盖(null?)。如果我删除Team City参数,则使用默认值。

条件不正确吗?如何将Team City属性设置为空白,并且仅在我输入某个值时才覆盖?

2 个答案:

答案 0 :(得分:6)

OP评论后更新的答案:

来自docs:

  

MSBuild允许您设置属性   从命令行使用   / property或/ p命令行开关。   从中收到的财产价值   命令行覆盖属性值   在项目文件和属性中设置   从环境继承的价值观   变量

所以你可以在TeamCity配置中设置一个属性$(VersionTC)并检查该属性是否为空并设置版本

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

(所以你先将Version设置为VersionTC。然后查看它是否为空并设置默认值

看看这个blog post解释这一切。


尝试以下内容:

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

请注意' '

周围的$(Version)(单引号)

答案 1 :(得分:4)

Team City可能仍然在命令行上传递参数,只有空白值,如,

/p:Version=""

或类似的东西。您看到的症状是由于MSBuild如何处理被覆盖的属性。在命令行中指定时,属性将获取该值,无论它是否也在静态(文件中的全局,而不是目标内)PropertyGroup声明中声明。因此,你的版本声明,条件被检查为空字符串,正在被完全跳过。

解决此问题的一种方法是将包含$(Version)声明及其Condition的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中,它将保留空值。