我有一个包含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” 没找到。确认<中的路径。导入>声明是 正确,并且该文件存在于磁盘上。
我尝试添加Wix Toolset (unofficial)
NuGet包,但是当我进入解决方案的Manage NuGet包的“在线”选项卡时,我只看到了3.9.1208.0版本。
目标是将包含二进制和wix msi包项目的解决方案放到构建服务器上,但如果我不能依赖NuGet来安装WiX,我不知道如何设置这个在另一台机器上。
答案 0 :(得分:7)
查看WiX工具集NuGet包,它修改了WiX MSBuild文件的路径,以便在机器上安装WiX时,从NuGet包而不是C:\Program Files\WiX
使用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)" />
由于这是一个WiX项目文件,因此Import元素没有检查WiXTargetsPath是否存在的条件,因此如果缺少Wix.targets文件,Visual Studio将无法加载项目。不幸的是,添加一个条件,如下所示,同时允许Visual Studio加载项目不会修复构建。
<Import Project="$(WixTargetsPath)" Condition="Exists($(WixTargetsPath))"/>
如果项目文件中有上述条件,则构建项目的Visual Studio将自动恢复WiX NuGet包,如果您安装了最新版本的NuGet,但仍然会收到有关缺少Build目标的构建错误WiX项目。只有在恢复WiX NuGet包后再次关闭并重新打开解决方案,才能解决此构建错误。
在构建服务器上,我将创建一个预构建步骤,在构建WiX项目之前使用NuGet.exe还原来恢复NuGet包:
NuGet.exe restore path\to\the\solution\yoursolution.sln
这将恢复WiX包。然后,您可以构建WiX项目,而不会出现有关丢失WiX目标文件的任何错误。
另一种方法是将packages目录检入源代码管理。但是,这会将二进制文件添加到源控件中,您可能不想这样做。
另外,WiX.Toolset.3.8.1128.0可从nuget.org获得,但NuGet对话框将显示最新版本。您可以使用程序包管理器控制台安装特定版本的NuGet程序包。当NuGet 3.0发布时,您应该可以从NuGet对话框中执行相同的操作。