构建版本时,将 NuGet 与 WIX 结合使用不起作用

Using NuGet with WIX doesn't work when building release

我有一个包含 WIX 项目的解决方案。我几个月前通过 NuGet 添加了 WIX,它的版本是 3.8.1128.0 在我的开发过程中构建时一切正常。

当我准备发布时,我在 SVN 中对文件夹进行分支,然后将该分支拉到我的开发机器上。当我在分支中打开解决方案时,它无法打开WIX 项目。 (它在项目旁边显示“(加载失败)”。

当我尝试从 VS 重新加载项目时,出现错误

The imported project "c:\Projects\xxxxx\yyyyy\SolutionName\packages\WiX.Toolset.3.8.1128.0\tools\wix\wwix.targets" was not found. Confirm that the path in the < Import > declaration is correct, and that the file exists on disk.

我尝试添加 Wix Toolset (unofficial) NuGet 包,但是当我转到解决方案的“管理 NuGet 包”的 "Online" 选项卡时,我只看到 3.9.1208.0 版本。

目标是将包含二进制项目和 wix msi 包的解决方案安装到构建服务器上,但如果我不能依赖 NuGet 来安装 WiX,我不确定如何进行在另一台机器上设置它。

查看 WiX 工具集 NuGet 包,它修改了 WiX MSBuild 文件的路径,以便从 NuGet 包中使用 MSBuild 文件,而不是从 C:\Program Files\WiX WiX 安装时它们所在的位置机器。项目文件的相关部分如下所示:

  <PropertyGroup>
    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>    
  </PropertyGroup>

  <PropertyGroup>
    <WixToolPath>$(SolutionDir)packages\WiX.Toolset.3.8.1128.0\tools\wix\    </WixToolPath>
    <WixTargetsPath>$(WixToolPath)wix.targets</WixTargetsPath>
    <WixTasksPath>$(WixToolPath)WixTasks.dll</WixTasksPath>
  </PropertyGroup>
  <Import Project="$(WixTargetsPath)" />

由于这是一个 WiX 项目文件,Import 元素没有检查 WiXTargetsPath 是否存在的条件,因此如果缺少 Wix.targets 文件,Visual Studio 将无法加载项目。不幸的是,添加一个条件,如下所示,同时允许 Visual Studio 加载项目并不能修复构建。

  <Import Project="$(WixTargetsPath)" Condition="Exists($(WixTargetsPath))"/>

如果项目文件中有上述条件,那么在构建项目时 Visual Studio 将自动恢复 WiX NuGet 包,如果您安装了最新版本的 NuGet,但仍然会出现关于缺少 WiX 项目的构建目标。此构建错误只能通过在恢复 WiX NuGet 包后再次关闭并重新打开解决方案来修复。

在构建服务器上,我将创建一个预构建步骤,在构建 WiX 项目之前使用 NuGet.exe restore 恢复 NuGet 包:

NuGet.exe restore path\to\the\solution\yoursolution.sln

这将恢复 WiX 包。然后您可以构建 WiX 项目,而不会出现有关缺少 WiX 目标文件的任何错误。

另一种方法是将包目录签入源代码管理。但是,这会将二进制文件添加到您可能不想做的源代码管理中。

另外 WiX.Toolset.3.8.1128.0 可从 nuget.org 获得,但 NuGet 对话框将显示最新版本。您可以使用包管理器控制台安装特定版本的 NuGet 包。当 NuGet 3.0 发布时,您应该能够从 NuGet 对话框中执行相同的操作。