TeamCity构建中MSBuild属性莫名清除,工具NuGet包配置异常
听起来你遇到的问题核心在于props文件的导入时机——NuGet会把包内的.props文件放在项目自身的导入语句之前,也就是在Microsoft.Common.props这类核心MSBuild文件之前导入。这时候很多MSBuild的默认属性还没完成初始化,要是你的props文件里的写法没注意,很容易不小心覆盖或清空原本该被后续核心文件设置的属性。
给你几个具体的排查和解决方向:
检查属性赋值的条件逻辑
别直接写无条件的属性赋值,比如<MyToolPath>$(MSBuildThisFileDirectory)..\tools</MyToolPath>,这种写法会强制把MyToolPath设为指定值,哪怕后续有其他逻辑要设置它,或者如果这个属性是MSBuild的默认属性,还会清空它原本的默认值。正确的做法是只在属性未设置时提供默认值:<PropertyGroup> <MyToolPath Condition="'$(MyToolPath)' == ''">$(MSBuildThisFileDirectory)..\tools</MyToolPath> </PropertyGroup>加了
Condition判断后,只会在属性为空的时候才赋值,不会干扰后续的属性设置。区分.props和.targets文件的用途
.props是用来提前设置默认值的,而.targets会在Microsoft.Common.targets之后导入,这时候所有核心属性都已经初始化完成。如果你的逻辑需要修改或依赖已经初始化好的MSBuild默认属性,把这部分逻辑移到.targets文件里会更安全。比如你要设置TeamCity相关的属性,这些属性可能依赖项目的输出路径、程序集名称等已经初始化好的值,放到.targets里就不会出现属性被清空的问题。用诊断日志定位问题
开启MSBuild的诊断日志(在TeamCity里给MSBuild步骤加参数/v:diag),然后在日志里搜索你怀疑被清空的属性名称,跟踪它的赋值轨迹。你能清楚看到是哪个文件的哪一行修改了这个属性,很快就能定位到props文件里的问题代码。避免意外重置全局属性
检查你的props文件里有没有不小心写到MSBuild的全局属性(比如AssemblyName、OutputPath这些),如果不是故意要覆盖,绝对不要无条件地给这些属性赋值,哪怕是空值也不行——这会直接清空后续核心文件要设置的默认值。
内容的提问来源于stack exchange,提问作者Miral

