MSBuild错误MSB3086,与TeamCity相关。

7

我正在尝试使用MSBuild Web DeployTeamCity构建和部署一个.NET 4项目。在我的本地开发机上,我用运行中的TeamCity实例成功地完成了这个过程,但是当我尝试使用相同的设置设置一个新的TeamCity实例时,出现以下错误:

\Microsoft.Common.targets(2249, 9): error MSB3086: Task could not find "sgen.exe" 
using the SdkToolsPath 
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\" or the 
registry key "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A".
Make sure the SdkToolsPath is set and the tool exists in the correct processor 
specific location under the SdkToolsPath and that the Microsoft Windows SDK 
is installed 

我正在运行 Windows Server 2008,并安装了 .NET 4,其中包括(我相信)MSBuild 4。我也按照其他线程的建议安装了 Windows SDK 7.1,但仍然没有运气。有任何想法或建议都将不胜感激。
谢谢。

1
我知道你已经提到过了,但这是一个SDK路径问题。 - Ritch Melton
4个回答

7
我也曾在使用 TeamCity 时遇到了同样的问题,以下是我解决此问题的步骤:
  1. 下载适用于 Windows 7.1 的 Windows SDK。如果你的服务器或用户不允许网络访问,则Web 安装程序将无法工作,因此我建议完整包下载。请注意下载正确的版本 —— x86 [32 位]、x64 [64 位] 或 Itanium。
  2. 在安装过程中,只需选择一个选项:.NET Development -> Tools enter image description here
  3. 再次尝试构建。我不需要重启代理即可使构建正常运行。

如果你接受默认的安装路径,sgen.exe将在以下位置找到:

C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\sgen.exe

6
使用Windows SDK 7.0A安装时,与Visual Studio有或没有可能会出现一些问题,主要表现在路径设置上。一个简便的方法是在构建机器上安装Visual Studio,但我认为这并不合适。另一个选择是将构建设置为不创建序列化程序集——在许多情况下,它们并不重要。需要注意的是,如果跳过发布版本,则此设置默认生效。
真正的解决方法是正确地指向TeamCity中的sgen.exe,并使用正确的toolspath告诉msbuild使用正确的文件夹。请参阅这个问题以获得详细解释。

谢谢回复,我同意在构建服务器上安装VS似乎是非常错误的,但看起来我可能不得不这样做。我按照 https://dev59.com/43E85IYBdhLWcg3wgDlI#5701714 中的建议设置了SdkToolsPath注册表键,但仍然出现相同的错误,并关闭了序列化,但还是出现了相同的错误。奇怪的是它仍在寻找7.0A,但我已将当前版本设置为7.1。我可能只能安装VS:-( 如果有其他建议,将不胜感激。 - Ben
@RitchMelton:为什么?构建服务器的部分目的是确保我可以在不需要厚重的开发工具的帮助下进行构建。 - Wyatt Barnett
@Wyatt - 我从未考虑过在CI中构建时不使用“厚重的开发工具”是一个目标,但安装VS可以缓解像OP这样的问题。将其放在服务器上的问题是它会消耗许可证,而你真的不应该那样做。 - Ritch Melton
@RitchMelton:确切地说,您不应该需要编辑器来构建工件。而且,您真的应该了解如何在没有工具的情况下构建它,依赖黑魔法是不好的。 - Wyatt Barnett
我真的很讨厌在构建服务器上安装VS的想法,但另一方面,我一直在注册表中搞来搞去,安装SDK,更改构建配置,并尝试更改默认的SDK,所有这些都不是我喜欢做的事情,也没有起作用,所以我安装了VS,它能正常工作...虽然这并不意味着我喜欢它 :p 谢谢你的帮助 :-) - Ben
@wyatt - 天哪,你这是猜测到什么程度了? - Ritch Melton

4
我在这个问题上研究了整整8个小时,最后放弃了,第二天早上30分钟内就解决了。我尝试了网络上能找到的所有方法。以下是我是如何解决的。我已经确认我的构建代理程序上已安装SDK 7.1和7.0。最终发现问题出在注册表设置上。
首先是针对MSBUILD,在“HKEY_LOCAL_MACHINE\SOFTWARE\MSBUILD\ToolsVersions\4.0”下,键值SDK40toolsPath的值是$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDK-NetFx40Tools-x86@InstallationFolder)。但是,在我的构建代理程序上,这个注册表并不存在!所以它没有引用任何东西。我不知道7.0A注册表设置应该怎么来?!
因此,我将一个工作正常的构建代理程序上的整个“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A”注册表导出到文件中,然后将其复制并导入到有问题的代理程序上。现在终于可以正常工作了。希望这能帮助到其他人。
以下是导出的注册表文件内容,可能过于详细。
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A]
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\"
"ProductVersion"="7.1.7600.0.30514"
"ProductName"="Microsoft Windows SDK for Windows 7 (7.1.7600.0.30514)"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDK-NetFx40Tools]
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Windows SDK Tools for .NET Framework 4.0"
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\NETFX 4.0 Tools\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDK-NetFx40Tools-x64]
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Windows SDK Tools for .NET Framework 4.0 (x64)"
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\NETFX 4.0         Tools\\x64\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDK-NetFx40Tools-x86]
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Windows SDK Tools for .NET Framework 4.0"
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\NETFX 4.0 Tools\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKBuild]
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\"
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Microsoft Windows SDK Headers and Libraries"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKIntellisenseNFX]
"InstallationFolder"="C:\\Windows\\Microsoft.NET\\Framework\\"
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Microsoft Windows SDK Intellisense for .Net"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKIntellisenseRefAssys]
"InstallationFolder"="C:\\Program Files\\Reference Assemblies\\Microsoft\\"
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Windows SDK Intellisense and Reference Assemblies"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKInterop]
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\"
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Microsoft Windows SDK NetFx Interop"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKNetFx35Tools]
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\bin\\"
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Microsoft Windows SDK NetFx 3.5 Tools"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKNetFx35Tools\1033]
"SP"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKNetFx35Tools-x64]
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\bin\\x64\\"
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Microsoft Windows SDK NetFx 3.5 Tools (x64)"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKSamples]
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Samples\\"
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Windows SDK Samples"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKTools]
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\bin\\"
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Windows SDK Common Utilities"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKTools-x64]
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\bin\\x64\\"
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Windows SDK Common Utilities (x64)"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKWin32Tools]
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\bin\\"
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Windows SDK Utilities for Win32 Development"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDKWin32Tools-x64]
"InstallationFolder"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\bin\\x64\\"
"ProductVersion"="7.1.7600.0.30514"
"ComponentName"="Windows SDK Utilities for Win32 Development (x64)"}

谢谢分享,最终我安装了VS,虽然有点麻烦但是成功了。如果我再次遇到这个问题,我一定会尝试遵循你的建议。 - Ben

0
在我的情况下,问题出现在我向项目添加Web引用(C# 2.0)时。通过手动构建代理,我能够解决它。
wsdl.exe /out:d:\dev\MyProxy.cs /order https://blahblahblah?wsdl 然后只需将MyProxy.cs复制到我的项目中即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接