在构建版本时,将NuGet与WIX一起使用不起作用

bpe*_*kes 4 wix nuget nuget-package visual-studio-2013 nuget-package-restore

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

当我准备发布时,我在SVN中分支文件夹,然后将分支拉到我的开发机器.当我在分支中打开解决方案时,它无法打开WIX项目.(它在项目旁边说"(加载失败)".

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

找不到导入的项目"c:\ Projects\xxxxx\yyyyy\SolutionName\packages\WiX.Toolset.3.8.1128.0\tools\wix\wwix.targets".确认<Import>声明中的路径是正确的,并且该文件存在于磁盘上.

我试图添加Wix Toolset (unofficial)NuGet包,但是当我进入解决方案的Manage NuGet包的"在线"选项卡时,我只看到3.9.1208.0版本.

目标是将包含二进制和wix msi包的项目的解决方案放到构建服务器上,但如果我不能依赖NuGet来安装WiX,我不知道如何在另一个上安装它.机.

Mat*_*ard 7

查看WiX Toolset NuGet包,它会修改WiX MSBuild文件的路径,以便C:\Program Files\WiX在计算机上安装WiX时,从NuGet包中使用MSBuild文件,而不是使用它们.项目文件的相关部分如下所示:

  <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)" />
Run Code Online (Sandbox Code Playgroud)

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

  <Import Project="$(WixTargetsPath)" Condition="Exists($(WixTargetsPath))"/>
Run Code Online (Sandbox Code Playgroud)

根据项目文件中的上述条件,构建项目的Visual Studio将自动恢复WiX NuGet包,如果您安装了最新版本的NuGet,但仍然会收到有关WiX项目缺少Build目标的构建错误.只有在恢复WiX NuGet包后再次关闭并重新打开解决方案,才能解决此构建错误.

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

NuGet.exe restore path\to\the\solution\yoursolution.sln
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是将packages目录检入源代码控制.但是,这会将二进制文件添加到源控件中,您可能不想这样做.

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

  • 通常使用NuGet,你可以在另一台机器上打开解决方案,一切都会正常工作.问题在于WiX NuGet包和WiX项目.WiX NuGet包试图覆盖单独安装的WiX.targets文件.由于这定义了项目,因此导致Visual Studio出现问题.其他NuGet包将自定义MSBuild目标文件添加到项目中,NuGet还原将处理它们而没有任何错误.该问题特定于WiX NuGet包. (2认同)
  • 具体来说,任何为项目定义 msbuild 目标的 NuGet 包都应该发生这种情况。问题是,为了知道要恢复哪些包,Visual Studio 必须加载所有项目文件。如果项目文件依赖于必须由 NuGet 安装的 .target 文件,则项目将无法加载,但仍会下载 NuGet 包。现在 .targets 文件已经存在,下次启动 Visual Studio 时,它应该可以正常工作。这就是为什么 Matt Ward 建议在启动 Visual Studio 之前使用“引导”脚本来加载 NuGet 包。 (2认同)