当我将我的Web部署项目从VS2008升级到VS2010测试版时,我能够在我的开发盒上本地执行构建。但是,当我尝试在TeamCity构建服务器上执行构建时,我开始遇到以下异常:
C:\Program Files\MSBuild\Microsoft\WebDeployment\v10.0\Microsoft.WebDeployment.targets(162, 37):
error MSB4086: A numeric comparison was attempted on "$(_SourceWebProjectPath.Length)"
that evaluates to "" instead of a number, in condition "'$(_SourceWebProjectPath)' != ''
And $(_SourceWebProjectPath.Length) >= 4)".
我确实在构建服务器上安装了Web部署项目插件,并且我将开发框上的C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ WebApplications目录复制到C:构建服务器上的\ Program Files \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \目录。注意:我的开发框是64位,构建服务器是32位。
我无法弄清楚为什么在构建服务器上的行为与我的开发机器上的行为不同。有人有什么想法吗?
谢谢, 史蒂夫
答案 0 :(得分:3)
MSBuild 4
(未安装和/或TeamCity链接到MSBuild 3.5)。
您必须确保MSBuild 4
是构建服务器上使用的版本。
Web Deployment Project 2010
使用MSBuild 4
的新功能,例如Property function
。如果使用先前版本的MSBuild,则不会评估属性函数,并且会发生错误。
如果您查看文件Microsoft.WebDeployment.targets
,您应该看到此声明:
<PropertyGroup Condition="'$(SourceWebProject)' != ''">
<_SourceWebProjectIndex>
$([MSBuild]::Add(1, $(SourceWebProject.LastIndexof('|'))))
</_SourceWebProjectIndex>
<_SourceWebProjectPath>
$(SourceWebProject.SubString($(_SourceWebProjectIndex)))
</_SourceWebProjectPath>
<_SourceWebProjectPathBeginWith Condition="'$(_SourceWebProjectPath)' != '' And ($(_SourceWebProjectPath.Length) >= 4)">
$(_SourceWebProjectPath.SubString(0,4))
</_SourceWebProjectPathBeginWith>
</PropertyGroup>
属性SourceWebProjectIndex
和SourceWebProjectPath
使用属性函数,MSBuild 3.5未对它们进行求值,因此无法评估SourceWebProjectPathBeginWith
上的条件,导致错误:< / p>
C:\Program Files\MSBuild\Microsoft\WebDeployment\v10.0\Microsoft.WebDeployment.targets(162, 37):
error MSB4086: A numeric comparison was attempted on "$(_SourceWebProjectPath.Length)"
that evaluates to "" instead of a number, in condition "'$(_SourceWebProjectPath)' != ''
And $(_SourceWebProjectPath.Length) >= 4)".