我有一个名为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属性设置为空白,并且仅在我输入某个值时才覆盖?
答案 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中,它将保留空值。