4

我正在尝试为我们的应用程序创建一个 Wix 安装程序。Wix Project 收获不起作用,因为它只将主 exe 文件复制到安装目录,所有 dll 等都不会被复制。

所以我想有一个预构建事件来构建应用程序并使用来自 Wix 的输出。

问题是输出将包含 .pdb、vchost.exe 等文件。我可以配置构建以使其仅输出所需的文件吗?

编辑:最终解决方案可以在这里找到 https://github.com/AndersMalmgren/FreePIE/blob/master/BuildTools

首先查看 https://github.com/AndersMalmgren/FreePIE/blob/master/BuildTools/build_installer.bat

4

1 回答 1

7

当我为我的项目创建任何类型的安装程序/zip 文件/任何东西时,我从不在 Visual Studio 的“标准”构建中,即在.csproj文件中这样做。
(我知道这就是您尝试放置预构建事件的地方 - 对吗?)
原因是我不想在我编程时对我所做的每个构建都重新构建安装程序/zip。

我一直在做的事情:
我创建了一个MSBuild 项目文件,我可以从资源管理器手动执行(通常通过批处理文件),它编译 Visual Studio 解决方案,然后创建 zip 文件、安装程序、NuGet 包或我需要的任何东西。
因此,创建设置完全脱离了 Visual Studio 解决方案,但我可以从源代码管理中提取最新更改,然后构建所有内容并单击一下即可创建设置。
Joel Test,第二个问题:“你能一步完成构建吗?”)

当我不需要 Visual Studio 放入输出文件夹的所有内容时,我只需先将需要的文件复制到不同的文件夹。

这是我的一个项目中的一个示例:

  1. MSBuild 文件
    最后一段(“将文件复制到发布文件夹”)将文件夹的内容\bin\Release(但不包括*.pdb*.xml文件)和一些文件从根文件夹复制到单独的“发布”目录:

     <!-- copy files to release folder -->
     <Target Name="CopyRelease">
             <MakeDir Directories="$(ReleaseDir)"/>
             <ItemGroup>
                     <ReleaseFiles
                             Include="$(OutDir)\**\*.*;
                                     README.md;
                                     License.rtf"
                             Exclude="$(OutDir)\*.pdb;
                                     $(OutDir)\*.xml">
                     </ReleaseFiles>
             </ItemGroup>
             <Copy SourceFiles="@(ReleaseFiles)" DestinationFiles="@(ReleaseFiles -> '$(ReleaseDir)\%(RecursiveDir)%(Filename)%(Extension)')"/>
    
     </Target>
    
  2. 我用来执行 MSBuild 文件
    的批处理文件 批处理文件中有更多代码(用于处理版本号等内容),但我执行 MSBuild 文件的重要部分是:

     rem path to msbuild.exe
     path=%path%;%windir%\Microsoft.net\Framework\v4.0.30319
    
     rem go to current folder
     cd %~dp0
    
     msbuild build.proj
    

我实际上是在使用 WiX 为这个项目构建安装程序,但我没有使用您正在使用的“收获”功能(我以前不知道)。我只是在WiX 项目文件
中为安装程序指定每个文件,然后我使用另一个批处理文件来构建项目(通过调用上面提到的第一个批处理文件),然后是 WiX 设置。

即使我对实际 WiX 工具的使用与您的不同,您仍然可以使用类似于上面解释的方法来为 WiX 的收获功能创建“源文件夹”:
调用一个批处理文件来准确复制您需要的文件另一个文件夹,并将用作创建安装程序的源。
如果您不想创建 MSBuild 文件,您甚至可以使用Robocopy之类的东西(它能够镜像完整的文件夹,但排除某些文件扩展名)。


编辑:

  1. 尝试构建您的完整解决方案,而不仅仅是一个项目。
    将包含以下内容的批处理文件放在文件所在的.sln文件夹中:

     set PATH=%PATH%;%WINDIR%\Microsoft.Net\Framework64\v4.0.30319
    
     rem go to current folder
     cd %~dp0
    
     msbuild YourSolution.sln /p:Configuration=Release
    
  2. 第二个错误说明了关于 a PreBuildEvent target
    --> 你是否已经在你的预构建事件中放入了一些东西.csproj?也许那行不通。


编辑2:

我正在做类似的事情:
我只有一个批处理文件,它将版本号(在我的情况下是硬编码的)放入环境变量中,然后在进行实际构建之前从我的主构建批处理中调用该批处理文件。
.csproj我的. _ (当我从 Visual Studio 构建时,我不关心版本号 - 我使用批处理文件创建所有发布版本,所以我只需要那里的版本号)0.0


编辑 3:

最后一步,将整个输出放入 Wix,链接每个文件,这在 mu 项目中不实用。它的几个子文件夹和数千个文件。关于如何在wix中链接整个输出文件夹的任何好主意?

抱歉,我以前从未尝试过。使用 WiX 的正确方法是从一开始就逐步构建设置

引用链接(我强调):

当然,将所有这些成百上千个组件输入到 WiX 源文件中是另一个挑战。该工具集有一个 小实用程序可以帮助解决这个问题(稍后会详细介绍),但真正的解决方案是概念上的改变。不要将安装程序视为一个单独的应用程序,当主应用程序已经完成时,它必须匆忙编写。由于 WiX 源文件和工具集本身可以轻松集成到您的开发环境中,因此您应该始终保持它们同步。一旦您开始处理新模块或向程序添加新的注册表引用,请同时修改相应的 WiX 源文件。这样,设置将与应用程序本身一起完成,并且无需提取以后安装所需的所有文件和其他信息。由于 WiX 项目可以模块化(稍后将详细介绍),因此如果您有一个大型团队而不是单个开发人员来开发应用程序,这种方法也同样适用。

引用文本中的链接指向描述该Heat工具的页面,这似乎是您之前提到的“收获”工具,并且已经尝试过但没有成功。

于 2013-02-09T22:18:07.807 回答