VSTS和WIX上的MSBuildExtensionsPath

时间:2017-08-24 12:54:40

标签: msbuild wix azure-devops

我有一个Visual Studio解决方案,我们使用Visual Studio Online Build使用VS 2015构建。我们希望将构建转换为VS 2017.它在本地为我构建,没有错误。但是,使用" VS2017 Hosted"在线构建时在尝试构建基于WIX的MSI时,构建代理程序失败并出现以下错误:

DEV\Setup\UISetup\UISetup.wixproj(56,3): Error MSB4019: The imported project "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\WiX\v3.x\Wix.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.

疑难解答,wixproj确实有一条此路径的import语句:

$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets

我在构建中添加了一些额外的步骤,并发现以下作为两个构建代理的比较:

&#34;托管&#34; (构建适用于此VS 2015构建代理)

 wix.targets Is Here:     C:\Program Files (x86)\MSBuild\Microsoft\WiX\v3.x\wix.targets 

 With Diagnostic output on MSBuild, here are the MSBuild property settings
 2017-08-19T19:12:13.3864207Z MSBuildExtensionsPath   = C:\Program Files (x86)\MSBuild
 2017-08-19T19:12:13.3864207Z MSBuildExtensionsPath32 = C:\Program Files (x86)\MSBuild
 2017-08-19T19:12:13.3864207Z MSBuildExtensionsPath64 = C:\Program Files\MSBuild

托管VS2017(在此构建代理上构建失败)

 Looking here for wix.targets:     C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\WiX\v3.x\Wix.targets <-- which errors

 But wix.targets is here:          C:\Program Files (x86)\MSBuild\Microsoft\WiX\v3.x\wix.targets <-- same as “Hosted” build agent

 With Diagnostic output on MSBuild, here are the MSBuild property settings
 2017-08-19T19:21:06.5320962Z MSBuildExtensionsPath   = C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild <-- Different on this build agent
 2017-08-19T19:21:06.5320962Z MSBuildExtensionsPath32 = C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild <-- Different on this build agent
 2017-08-19T19:21:06.5320962Z MSBuildExtensionsPath64 = C:\Program Files\MSBuild

我已经开通了微软支持的门票,但到目前为止,他们一直没有帮助。真正的问题是MSBuildExtensionsPath32指向&#34; VS2017 Hosted&#34;上的另一个文件夹。构建代理,但wix.targets文件位于原始文件夹中。我不想硬编码wix.targets的路径,但我真的没有看到替代方案。

有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:2)

VS 2017现在使用隔离安装,其中多个版本的VS(例如VS 2017社区,企业版和VS 2017预览版)可以并排安装,不再是机器范围的安装。

这意味着所有扩展都需要安装到VS版本中,就像WiX的VS 2017插件一样。这意味着当使用VS 2017安装的msbuild工具进行构建时,如果未将扩展安装到该特定VS实例中,则可能无法找到全局安装的工具(如WiX),这似乎是托管VSTS代理的情况。 / p>

要解决此类问题,NuGet包like this one(维护在https://github.com/kzu/WiX)存在,其中包含构建WiX项目所需的工具,因此nuget恢复将获取所需资产,项目将使用这些在构建期间,不需要在构建代理上安装软件。

答案 1 :(得分:0)

问题是MSBuild v15改变了MSBuildExtensionsPath32的工作方式,以支持本地的每个实例安装。直接在Import中使用时,它会继续指向全局位置。因此,在MSBuild成为每个实例之前,你的.wixproj需要以不同的方式处理wix.targets。看一下使用File | New Project从Visual Studio创建的.wixproj;它看起来像是在底部:

<Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' " />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') " />
<Target Name="EnsureWixToolsetInstalled" Condition=" '$(WixTargetsImported)' != 'true' ">
  <Error Text="The WiX Toolset v3.11 (or newer) build tools must be installed to build this project. To download the WiX Toolset, see http://wixtoolset.org/releases/" />
</Target>

答案 2 :(得分:0)

我们正在内部使用Azure DevOps 2019并收到相同的错误。在Build Pipeline中,我们使用MSBuild Task = MSBuild 16.0来构建解决方案(包括WIX项目)。

我们切换了MSBuild版本= MSBuild 14.0 ,该错误消失了。在我们需要更新的MSBuild版本之前,这是一个临时修复,但现在已经足够。