【问题标题】:Build project for Wix installer为 Wix 安装程序构建项目
【发布时间】:2013-02-09 21:01:34
【问题描述】:

我正在尝试为我们的应用创建一个 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

【问题讨论】:

    标签: .net wix


    【解决方案1】:

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

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

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

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

    1. The MSBuild file
      最后一段(“将文件复制到发布文件夹”)将\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. The batch file that I use to execute the MSBuild file
      批处理文件中有更多代码(用于处理版本号等内容),但我执行 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 project file 中为安装程序指定每个文件,然后我使用another batch file 来构建项目(通过调用上面提到的第一个批处理文件),然后是 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. 第二个错误说明了PreBuildEvent target
      --> 您是否已经在.csproj 的预构建事件中添加了一些内容?也许这行不通。


    EDIT2:

    我正在做类似的事情:
    我只有一个batch file,它将版本号(在我的情况下是硬编码的)放入环境变量中,然后在进行实际构建之前从我的main build batch 调用该批处理文件。
    在我的.csproj 中,我有一个pre-build event,它将程序集版本号设置为环境变量中的值(如果存在),否则只设置为0.0
    (我不关心从 Visual Studio 构建时的版本号 - 我使用批处理文件创建所有发布版本,所以我只需要那里的版本号)


    编辑 3:

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

    对不起,我以前从未尝试过。使用 WiX 的正确方法是 to build the setup incrementally right from the beginning

    引用链接(我强调):

    将所有成百上千个组件输入到 WiX 当然,源文件提出了另一个挑战。该工具集有一个 small utility 可以帮助解决这个问题(稍后会详细介绍),但是 真正的解决方案是概念上的改变。 停止考虑设置 程序作为一个单独的应用程序,必须匆忙编写 当主应用程序已经完成时。作为 WiX 源文件 并且工具集本身可以集成到您的开发中 环境很容易,你应该让它们一直保持同步。尽快 当您开始处理新模块或添加新的注册表引用时 到你的程序,同时修改对应的WiX源文件 时间。 这样,设置将与 应用程序本身,无需提取所有文件 以及稍后安装所需的其他信息。 由于 WiX 项目可以模块化(稍后会详细介绍),这 如果您有一个庞大的团队致力于 应用程序而不是单个开发人员。

    link in the quoted text 指向描述Heat 工具的页面,这似乎是您之前提到的“收获”工具,并且已经尝试过但没有成功。

    【讨论】:

    • 谢谢你可能会走这条路,也许你能帮我做一些相关的事情。我正在尝试使用 bat 文件构建投影仪。请参阅编辑
    • @Anders:我无法编译您的完整解决方案,因为我在这台机器上只有 C# Express,而您使用的是 C# Express 不支持的 MSTest。但是对于我上面建议的批处理文件,除了测试项目之外的所有其他东西确实编译...我只是得到了很多测试项目的错误。
    • 我发现了问题,我们使用msbuild脚本从Git中提取版本号。然后从 pre buld 事件触发该 msbuild 脚本(这样您就可以从 VS 中构建)。该预构建事件与 msbuild 不兼容。我可以禁用 mnsbuild 的构建事件吗?
    • 最后一步,将整个输出放入 Wix,链接每个文件,这在 mu 项目中不实用。它的几个子文件夹和数千个文件。关于如何在 wix 中链接整个输出文件夹的任何好主意?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多