为Wix安装程序构建项目

时间:2013-02-09 21:01:34

标签: .net wix

我正在尝试为我们的应用创建一个Wix安装程序。 Wix项目收获不起作用,因为它只将主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

1 个答案:

答案 0 :(得分:7)

当我创建任何类型的安装程序/ 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
    

  3. 我实际上是使用WiX为这个项目构建安装程序,但是我没有使用&#34;收获&#34;你正在使用的功能(我之前不知道) 我只是在WiX project file中为安装程序指定了每个文件,然后我使用another batch file来构建项目(通过调用上面提到的第一个批处理文件)然后WiX设置。

    即使我对实际WiX工具的使用与您的不同,您仍然可以使用类似于上述方法的方法来创建&#34;源文件夹&#34;对于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 - &GT;您是否已经在.csproj的预制活动中添加了一些内容?也许这不起作用。


    3. <强> 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工具的页面,该工具似乎是&#34;收获&#34;你之前提到的工具已经尝试过但没有成功。