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

问题描述

| 我有一个名为Version的C#项目属性,定义为
<Version Condition=\"$(Version)==\'\'\">1.2.3.4<Version>
默认值为1.2.3.4。 我有一个Team City系统属性(也称为版本),它设置为覆盖。因此,在Team City的自定义运行对话框中,我可以为Version指定一个值,然后使用该值。这很好。 但是,如果在Team City中将参数保留为空白,则默认值仍会覆盖为空白(空?)。如果删除Team City参数,则使用默认值。 条件不正确吗?如何将“团队城市”属性设置为空白,并且仅在输入一些值时才覆盖?     

解决方法

OP发表评论后更新了答案: 从文档:   MSBuild允许您设置属性   从命令行使用   / property或/ p命令行开关。   从   命令行覆盖属性值   在项目文件和属性中设置   从环境继承的价值观   变量。 因此,您只需在TeamCity配置中设置属性$(VersionTC)并检查该属性是否为空并设置版本
<Version>$(VersionTC)<Version>
<Version Condition=\"\'$(VersionTC)\'==\'\'\">1.2.3.4<Version>
(因此您首先将
Version
设置为
VersionTC
。然后查看它是否为空并设置默认值) 看看这篇博客文章,解释所有这一切。 尝试以下操作:
<Version Condition=\" \'$(Version)\'==\'\' \">1.2.3.4<Version>
注意
$(Version)
周围的
\'  \'
(单引号)     ,Team City可能仍在命令行上传递参数,只是带有空白值,例如,
/p:Version=\"\"
或类似的东西。您看到的症状是由于MSBuild如何处理覆盖的属性。在命令行上指定时,无论是否还在静态(文件中是全局的,而不是在目标内部的)PropertyGroup声明中声明了属性,该属性都将采用该值。因此,将完全跳过您对Version的声明(其中的Condition被检查为空字符串)。 解决此问题的一种方法是将包含$(Version)声明及其条件的PropertyGroup移动到首次使用它的目标中。 MSBuild将允许从运行时从目标内部创建的\“ dynamic \”属性覆盖命令行属性的值。 如果您运行此命令行...
> 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>
...您将获得Version显示1.2.3.4,而PropertyGroup在目标之外,则它将保留为空值。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...