编辑:这是通过使用“dotnet build [wixproj]”而不是 msbuild 解决的,但我会暂时将问题留在这里,因为我很好奇我是否误解了它应该如何工作。我不认为 HeatWave 会在命令行 msbuild 中发挥作用。
我有一个 wix 4 项目,其中包含以下部分对扩展的包引用:
<ItemGroup>
<PackageReference Include="WixToolset.Netfx.wixext" Version="4.0.0" />
<PackageReference Include="WixToolset.Util.wixext" Version="4.0.0" />
<PackageReference Include="WixToolset.UI.wixext" Version="4.0.0" />
</ItemGroup>
我不是 100% 熟悉它在引擎盖下的工作原理,但是当我使用
msbuild myproject.wixproj
在我的本地机器上,PackageReferences 收集在@(Extensions) msbuild 项目列表中,最后作为参数发送给wix build -ext [extensionpath]
。这非常有效,并且肯定比 Wix3 的工作方式更上一层楼。
工作构建日志的相关部分包括例如扩展项目:
WixExtension
C:\Users\Username\.nuget\packages\wixtoolset.netfx.wixext\4.0.0\build\..\wixext4\WixToolset.Netfx.wixext.dll
C:\Users\Username\.nuget\packages\wixtoolset.ui.wixext\4.0.0\build\..\wixext4\WixToolset.UI.wixext.dll
C:\Users\Username\.nuget\packages\wixtoolset.util.wixext\4.0.0\build\..\wixext4\WixToolset.Util.wixext.dll
但是,当我尝试在另一台机器(构建服务器)上执行此操作时,到达构建步骤时没有@(扩展)。 @(WixExtension) 项目永远不会被填充。相关日志
Target "ResolveWixExtensionReferences" skipped, due to false condition; ( '@(WixExtension)' != '') was evaluated as ( '' != '').
因此构建将失败,因为扩展不可用,例如
错误 WIX0200:文件元素包含未处理的扩展元素“NativeImage”。请确保已提供“http://wixtoolset.org/schemas/v4/wxs/netfx”命名空间中元素的扩展
尝试调试时,我在工作构建的日志中注意到这一点:它使用不同的方法收集包引用,这似乎来自 HeatWave VS 插件添加的 msbuild 扩展。但是此插件在构建服务器上不可用,因此日志中也没有此消息。它使用那里的 msbuild 的默认 CollectPackageReferences 目标。
Overriding target "CollectPackageReferences" in project "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\NuGet\NuGet.targets" with target "CollectPackageReferences" from project "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\FireGiant\HeatWave\FireGiant.HeatWave.PackageDependencyResolution.targets".
我不确定我是否理解正确:但我不应该在没有 HeatWave 的情况下在机器上使用扩展进行构建吗?构建是否依赖于 msbuild 扩展而不仅仅是 Wix4 Sdk 本身?我是否需要将对 WixToolset.Heat 的引用添加到 wixproj 以使其在构建服务器上运行,即使没有使用实际的收获?