CI服务器上的MSBuild找不到AL.exe

49
我在我的TeamCity CI构建服务器上遇到了一个问题,在编译过程中我得到了以下错误:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(2342, 9): error MSB3086: 任务无法使用 SdkToolsPath "" 或注册表键 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" 找到 "AL.exe"。确保设置了 SdkToolsPath 并且该工具存在于 SdkToolsPath 下的正确处理器特定位置,并安装了 Microsoft Windows SDK。
我发现一年前有类似的报告,当时人们正在升级到 .NET 3.5,例如 这个。在那种情况下,安装最新的SDK解决了问题,但是我已经在我的构建服务器上安装了最新的SDK(Microsoft Windows SDK for Windows 7 and .NET Framework 4)。MSBuild工具都在服务器上的一个名为的文件夹中。

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319

并且AL.exe存在于

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

然而,在错误信息中提到的注册表键不存在。因此,MSBuild的安装/配置似乎出了些问题。这个错误只会发生在需要AL.exe的嵌入式资源项目中。


今天我们遇到了这个问题的再次出现,这是在昨晚安装了.NET补丁之后发生的,我们不得不重新运行接受答案中的命令。非常奇怪! - Danny Tuppeny
9个回答

54

假设您已经安装了最新的SDK(我假定是v7.1),请按以下步骤进行操作:

  1. 从开始菜单中选择“Microsoft Windows SDK v7.1”
  2. 选择“Windows SDK 7.1 Command Prompt”,并进入
  3. cd Setup

  4. WindowsSdkVer -version:v7.1

这将告诉msbuild使用该版本的工具,而无需进行任何可怕的注册表编辑。


1
这非常优雅,远比我的注册表修改要好得多。一个普通人怎么可能知道这些东西?顺便说一句,既然您觉得我的问题值得回答,请考虑点个赞。 - Tim Long
6
这是解决我运行在Windows 2003 64位服务器上的问题的一半方法。Msbuild正在寻找注册表中32位部分(HKEY_LOCAL_MACHINE\Software\Wow6432Node)的键,而WindowsSdkVer设置了64位部分。我必须手动更新HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\MSBuild\ToolsVersions\4.0路径才能使其正常工作。 - Benjamin Wegman
3
在较新版本的.NET中,Windows SDK命令行已被删除。如果您正在使用msbuild proj文件,请尝试从<MSBuild>任务中删除ToolsVersion,这对我有帮助。我猜它是使用安装的最新SDK而不是尝试使用特定(不存在)的SDK。 - Sire

18
尽管这个问题已经很老了,但它仍然出现在谷歌搜索结果的前列,所以我决定发布我的解决方案。在安装TeamCity时,我遇到了与Windows Server 2016和Windows 10 Pro相同的问题。我已经安装了Microsoft Build Tools 2015Windows 10 SDK(只有.NET 4.6.2工具),并从问题中得到了错误信息。缺失的部分是设置环境变量:TargetFrameworkSDKToolsDirectory=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools。设置环境变量后,MSBuild能够解析所有需要的工具,包括AL.exe,并成功构建。如果可以通过在注册表中设置值来实现相同的效果,请告诉我,但在这种情况下环境变量也非常有效,不需要安装VS。

我们在谈论系统环境变量还是构建配置设置——参数?对于最后一个,env.会添加到TargetFrameworkSDKToolsDirectory之前,对吗? - CularBytes
我的评论是正确的,加上那个就解决了问题。 - CularBytes
@CularBytes,我不完全理解您的第一条评论。我已将该环境变量添加到 TC 运行的用户变量中。它也可以作为系统变量添加。我很高兴它有所帮助。 - Andrii Litvinov
3
我曾在Windows 2012 R2上使用TeamCity 2017.1时遇到过类似的问题。我设置了环境变量,但只有在重启了两个Team City服务之后,msbuild才能看到新的变量。 - BrandonG

6
您还需要应用以下注册表修复程序,以更新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)"

4

请按照以下步骤进行操作。这对我非常有效,节省了我的时间。

1. 右击 我的电脑 图标并选择 属性,或在 Windows 控制面板 中选择 系统

2. 选择 高级系统设置

3. 在 高级 选项卡中,单击 环境变量

4. 单击 新建,在 用户变量 下创建一个新的环境变量。

5. 变量名称:TargetFrameworkSDKToolsDirectory

6. 变量值:TargetFrameworkSDKToolsDirectory=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools

变量值取决于您的 SDK 安装路径。 enter image description here

7. 单击 确定 并保存所有窗口。

8. 重启 Visual Studio。


4
我有同样的问题,在此提供我的简单解决方案。
在安装了Microsoft Windows SDK 7.1后,在TeamCity服务器上:
在注册表编辑器中更改以下键:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\SDK40ToolsPath

to

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

3
我有一个简单有效的解决方案。
问题似乎在于Visual Studio提供的工具版本是7.0A,而Windows SDK提供的版本是7.1。这很好,但MSBuild.exe仍然在寻找不存在的7.0A注册表键。这一定是个bug!
查看我的注册表,V6.0和V7.1的所有信息都正确无误。所以我的解决方案很简单。我创建了一个注册表链接,使7.1键的别名。
使用内置工具无法创建注册表链接,因此我从here下载了一个名为“regln”的小实用程序。
C:\> regln-x86.exe“\Registry\Machine\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A”“\Registry \Machine\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1”
完成了。现在TeamCity服务器上的MSBuild完美运行。

2

添加一个系统环境变量TargetFrameworkSDKToolsDirectory

格式如下:

TargetFrameworkSDKToolsDirectory=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools

重启VS即可。


1

0
我们最近遇到了一个问题,尝试让我们的 .Net 4.0 版本构建正常工作。我们发现 al.exe 的位置已经改变,原来的包含在 .Net 4.0 中的 MSBuild 所寻找的位置和后来发布的 Visual Studio SDK for .Net 4.0 不同。
由于可用的独立安装 SDK 工具的唯一方法就是我们之前已经安装但不成功(你提到的那个),我们想到的唯一解决办法就是在构建代理上安装 Visual Studio。我们在那里安装了 Visual Studio 2010 Express(为了保持安装尽可能轻量化),问题得到了解决。这并不是一个很好的解决方案,但确实可行——安装 VS2010 也会安装 MSBuild 寻找的特定版本的 SDK 工具。
这真的不应该是一个问题,但似乎没有办法让 MSBuild 在正确的位置寻找工具,即使在注册表中杂乱无章地修改也无济于事。

很遗憾,在这台服务器上安装Visual Studio可能是不可能的事情。不过还是谢谢你提供的信息。 - Tim Long

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