CI服务器上的MSBuild无法findAL.exe

我在TeamCity CI构build服务器上遇到问题,在编译期间出现以下错误:

C:\ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Common.targets(2342,9):错误MSB3086:任务使用SdkToolsPath“”或registry项“HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v7.0A“。 确保设置了SdkToolsPath,并且该工具存在于SdkToolsPath下正确的处理器特定位置,并且安装了Microsoft Windows SDK

一年前,当人们升级到.NET 3.5时,我发现了类似的报告,例如这个 。 在这种情况下,安装最新的SDK解决了这个问题,但是我已经在我的构build服务器上安装了最新的SDK( 适用于Windows 7和.NET Framework 4的Microsoft Windows SDK )。 MSBuild工具都在服务器上,在一个名为的文件夹中

C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319

和AL.exe存在于

C:\ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Bin \ NETFX 4.0工具

但是,错误消息中提到的registry项不存在。 所以,似乎MSBuild的安装/configuration有问题。 只有具有embedded资源的项目才会出现此错误,该资源需要AL.exe。

正如你已经安装了最新的SDK(我假设这是V7.1)

  1. 转到“开始”菜单中的“Microsoft Windows SDK v7.1”
  2. select“Windows SDK 7.1命令提示符”并进入
  3. cd安装程序

  4. WindowsSdkVer -version:v7.1

这将告诉msbuild使用该版本的工具,而不需要做任何可怕的registry编辑。

即使这个问题是相当古老的,但它仍然出现在谷歌search结果的顶部,所以我决定发布我的解决scheme。 在Windows Server 2016和Windows 10 Pro上的TeamCity安装过程中,我遇到了同样的问题。

我已经安装了Microsoft Build Tools 2015和Windows 10 SDK (仅用于.NET 4.6.2的工具),并从问题中得到了错误。

缺less的难题是设置环境variables: TargetFrameworkSDKToolsDirectory=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools

设置环境variablesMSBuild后,能够解决所有需要的工具,包括AL.exe和build立成功。

请让我知道,如果可以通过在registry中设置值来实现相同,但在这种情况下环境variables也可以很好地工作,并且不需要安装VS。

您还需要应用以下registry修补程序来更新msbuild以指向V7.1 sdk值。

 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0] "MSBuildToolsPath"="C:\\WINDOWS\\Microsoft.NET\\Framework\\v4.0.30319\\" "MSBuildToolsRoot"="C:\\WINDOWS\\Microsoft.NET\\Framework\\" "FrameworkSDKRoot"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1@InstallationFolder)" "MSBuildRuntimeVersion"="4.0.30319" "SDK40ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1\\WinSDK-NetFx40Tools-x86@InstallationFolder)" "SDK35ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1\\WinSDKNetFx35Tools@InstallationFolder)" "MSBuildToolsPath32"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MSBuild\\ToolsVersions\\4.0@MSBuildToolsPath)" 

我有同样的问题,这是我的简单答案。

在TeamCity服务器上安装了Microsoft Windows SDK 7.1之后。

在registry中更改此项

  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\SDK40ToolsPath 

  $(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDK-NetFx40Tools-x86@InstallationFolder) 

看看图片,我得到了我的第一个TeamCity项目的build设! (是v7.0a)我得到了一张照片,显示这很简单。

 > Oops! Your picture couldn't be submitted because: > > We're sorry, but as a spam prevention mechanism, new users aren't > allowed to post images. Earn more than 10 reputation to post images. 

我有一个简单,有效的修复。

问题似乎是Visual Studio提供的工具版本是7.0A版本,而随Windows SDK提供的版本是7.1版本。 这一切都很好,但MSBuild.exe仍在寻找7.0A版本的registry项,这些registry项不存在。 这必须是一个错误!

查看我的registry,V6.0和V7.1的所有信息都是正确的。 所以我的解决scheme很简单。 我创build了一个registry链接,使7.1键的别名。

使用内置工具创buildregistry链接是不可能的,所以我从这里下载了一个名为“regln”的小工具。

C:> regln-x86.exe“\ Registry \ Machine \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v7.0A”“\ Registry \ Machine \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v7.1”

任务完成。 MSBuild现在可以在TeamCity服务器上完美工作。

同样的问题在Windows 10上设置一个新的生成服务器。find并安装最新的(当时) Microsoft Windows SDK for Windows 7和.NET Framework 4,并解决了这个问题。

我们最近有这个问题试图让我们的。NET 4.0生成工作。 我们发现al.exe的位置在.NET 4.0的原始MSBuild的外观和Visual Studio SDK的.NET 4.0(稍后发布)之间发生了变化。

由于可用的SDK工具的唯一独立安装是我们已经安装的,而且没有成功(我们提到的那个),我们唯一能想到的解决scheme就是在构build代理上安装Visual Studio。 我们把Visual Studio 2010 Express (为了保持安装尽可能轻量级)在那里,问题就消失了。 不是一个漂亮的解决scheme,但它确实工作 – 安装VS2010还安装了MSBuild似乎寻找特定版本的SDK工具。

这是一个真的不应该发生的问题,但似乎没有办法让MSBuild在工具的正确位置查找,甚至在registry中进行黑客攻击。