0

我正在构建一个需要安装 Azure SDK 的项目。不幸的是,我无法安装 SDK,因为 VSTools 安装程序不在 Docker 容器中运行。我正在尝试重新创建安装程序执行的步骤,以便项目认为 SDK 已正确安装。我得到的错误信息是:

C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\VisualStudio\v15.0\Windows Azure Tools\2.9\Microsoft.WindowsAzure.targets(1093,5):错误:WAT080:无法找到 Microsoft Azure SDK。请确保已安装 Microsoft Azure SDK v2.9。[C:\BuildAgent\work\da35ef67e7dea9a9\EMCloudService\EMCloudService.ccproj]

文件中的第 1093 行.targets是:

  <Target
      Name="VerifySDKInstallation"> // <---- Line 1093

    <WATMessage Condition=" !Exists('$(ServiceHostingSDKInstallDir)') or
                            !Exists('$(ServiceHostingSDKBinDir)') or
                            !Exists('$(ServiceHostingSDKTaskPath)') "
                Type="Error"
                Code="WAT080"
                Arguments="$(ActiveAzureSdkVersion)" />

    <WATMessage Condition=" !Exists('$(AzureClientLibInstallDir)') or
                            !Exists('$(AzureClientLibToolsRefDir)') or
                            !Exists('$(StorageClientAssemblyFullPath)') "
                Type="Error"
                Code="WAT081"
                Arguments="$(ActiveAzureClientLibVersion)" />

  </Target>

因此,似乎错误是因为这三个路径之一不存在。第一个来自以下行:

<ServiceHostingSDKInstallDir Condition=" '$(ServiceHostingSDKInstallDir)' == '' ">$([MSBuild]::GetRegistryValueFromView('$(ServiceHostingSDKRegistryKey)', 'InstallPath', null, RegistryView.Registry32))</ServiceHostingSDKInstallDir>

所以,基本上它是在注册表中查找。我从一台正常工作的机器上复制了这个值,它的值是“C:\Program Files\Microsoft SDKs\Azure.NET SDK\”

我复制了那个目录。接下来是ServiceHostingSDKBinDir,定义为:

<ServiceHostingSDKBinDir     Condition=" '$(ServiceHostingSDKBinDir)' == '' ">$(ServiceHostingSDKInstallDir)bin\</ServiceHostingSDKBinDir>

所以应该没问题,因为 ServiceHostingSDKInstallDir 存在。最后是 ServiceHostingSDKTaskPath,即:

<ServiceHostingSDKTaskPath   Condition=" '$(ServiceHostingSDKTaskPath)' == '' ">$(ServiceHostingSDKBinDir)Microsoft.ServiceHosting.Tools.MSBuildTasks.dll</ServiceHostingSDKTaskPath>

所以,看起来我真的应该能够复制“C:\ Program Files \ Microsoft SDKs \ Azure.NET SDK \”目录,为ActiveAzureSdkVersion和ServiceHostingSDKInstallDir传递正确的参数,一切都应该工作:

msbuild EM.sln `
  /p:ActiveAzureSdkVersion="2.9" `
  /p:ServiceHostingSDKInstallDir="C:/Program Files/Microsoft SDKs/Azure/.NET SDK/"

然而,我仍然得到同样的错误。谁能想到我需要复制或传递的其他任何内容?谢谢!

4

2 回答 2

1

WAT080 是否有解决方法:无法找到 Microsoft Azure SDK

根据文件Microsoft.WindowsAzure.targets(1093,5),我们可以得到以下代码片段:

  <PropertyGroup>
    <ActiveAzureSdkVersion Condition=" '$(ActiveAzureSdkVersion)' == '' ">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Azure Tools for Microsoft Visual Studio\15.0\v2.9', 'ActiveWindowsAzureVersion', null, RegistryView.Registry32))</ActiveAzureSdkVersion>
    <!-- Sdk reversion -->
    <ActiveAzureSdkVersion Condition=" '$(ActiveAzureSdkVersion)' == '' ">2.9</ActiveAzureSdkVersion>
    <ServiceHostingSDKRegistryKey>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\ServiceHosting\v$(ActiveAzureSdkVersion)</ServiceHostingSDKRegistryKey>
    <ServiceHostingSDKInstallDir Condition=" '$(ServiceHostingSDKInstallDir)' == '' ">$([MSBuild]::GetRegistryValueFromView('$(ServiceHostingSDKRegistryKey)', 'InstallPath', null, RegistryView.Registry32))</ServiceHostingSDKInstallDir>

    <!-- Ensure ServiceHostingSDKInstallDir has a trailing slash, so it can be concatenated -->
    <ServiceHostingSDKInstallDir Condition=" '$(ServiceHostingSDKInstallDir)' != '' and !HasTrailingSlash('$(ServiceHostingSDKInstallDir)')">$(ServiceHostingSDKInstallDir)\</ServiceHostingSDKInstallDir>

    ...
    ...
  </PropertyGroup>

我们可以知道参数的值ServiceHostingSDKRegistryKey是:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\ServiceHosting\v$(ActiveAzureSdkVersion)

简单知道 的值$(ActiveAzureSdkVersion)2.9,所以的值ServiceHostingSDKInstallDir应该是InstallPath参数ServiceHostingSDKRegistryKey的值。

然后,我们打开注册表并切换到上述注册表项的路径:

在此处输入图像描述

的值InstallPathC:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9\而不是旧值C:\Program Files\Microsoft SDKs\Azure.NET SDK\

此外,您还可以找到该 Azure SDK 的位置C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9,您在命令行中使用参数指定了它/p:ServiceHostingSDKInstallDir

所以,这个问题的原因是注册表项的值不正确。虽然用 重写/p:ServiceHostingSDKInstallDir,但是在导入Microsoft.WindowsAzure.targets到项目文件并执行目标VerifySDKInstallation时,MSBuild/Visual Studio 似乎会.targets根据就近原则调用文件中的参数 $(ServiceHostingSDKInstallDir)。

此问题的解决方法,您可以尝试将注册表项更改为正确的路径,或者如果您不想修改注册表,您可以尝试将 SDK 文件夹复制到旧路径C:\Program Files\Microsoft SDKs\Azure.NET SDK\

希望这可以帮助。

于 2018-09-25T04:22:01.587 回答
1

想出了这个。真正有帮助的是将以下内容添加到.targets文件中,就在第 1093 行下方:

<Message Text="ServiceHostingSDKInstallDir = $(ServiceHostingSDKInstallDir)" />
<Message Text="ServiceHostingSDKBinDir = $(ServiceHostingSDKBinDir)" />
<Message Text="ServiceHostingSDKTaskPath = $(ServiceHostingSDKTaskPath)" />

这让我看到了它试图寻找的路径。在构建输出中,我得到:

ServiceHostingSDKInstallDir = C:/Program Files/Microsoft SDKs/Azure/.NET SDK/
ServiceHostingSDKBinDir = C:/Program Files/Microsoft SDKs/Azure/.NET SDK/bin\
ServiceHostingSDKTaskPath = C:/Program Files/Microsoft SDKs/Azure/.NET SDK/bin\Microsoft.ServiceHosting.Tools.MSBuildTasks.dll

因此,该路径C:/Program Files/Microsoft SDKs/Azure/.NET SDK/bin\不存在,因为它缺少版本号。原来这个ActiveAzureSdkVersion参数只有在通过注册表获取路径的时候才会用到,所以在我的情况下传入是没有意义的。相反,我需要传入 SDK 的完整路径,包括版本:

MSBuild.exe .\EM.sln /p:ServiceHostingSDKInstallDir="C:/Program Files/Microsoft SDKs/Azure/.NET SDK/v2.9/"

希望这对某人有帮助!

于 2018-09-25T16:48:15.053 回答