如何解决使用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在目标之外,则它将保留为空值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。