Wix Bootstrapper采用大包装

时间:2017-08-15 16:00:57

标签: wix burn wix3.11

我正在使用Wix Toolset 3.11并且我正在尝试创建一个Wix引导程序,它正在为我的软件安装一个非常大的先决条件 - 一个遗留的InstallShield可执行文件,在~600个文件夹中找到~5000个相关文件。我已将所有这些文件压缩为一个大约3GB的自解压存档。尝试构建时出现以下错误:

  

light.exe(0,0):错误LGHT0001:算术运算导致溢出。

以下是我在引导程序中的当前相关XML:

<Chain>
   <PackageGroupRef Id="MyPrerequisites"/>
   <PackageGroupRef Id="ReallyBigExe"/>
   <PackageGroupRef Id="OtherStuff"/>
</Chain>
<Fragment>
   <util:RegistrySearch Id=ReallyBigExeFound" Key="Assume searching stuff is here"/>
   <PackageGroup Id=ReallyBigExe">
      <ExePackage InstallCondition="ReallyBigExeFound"
                  Compressed="no" 
                  DisplayName="Install Really Big Thing"
                  Permanent="no"
                  SourceFile="Packages\ReallyBigThing.exe"
                  Name="ReallyBigThing.exe"/>
   </PackageGroup>
</Fragment>

我尝试过不同的压缩,缓存,名称等变体,但都会导致同样的错误。我知道这是由于包含的exe文件的大文件大小;见Github Issue here

我也看到过分离的容器应该有助于解决这个问题。我尝试了几个使用容器和我的PackageGroup的组合,也无济于事。

所以,问题是:我如何在安装程序中包含这个非常大的ex​​e包,以便我可以将其安装在包链中,但不会将其嵌入到引导数据文件中?

1 个答案:

答案 0 :(得分:1)

我对问题的解决方法:

我们不想跟踪外部“ReallyBigExe”的文件,因为它应该是一个独立的产品。我没有将5k文件打包到安装程序中的有效负载中,而是创建了一个允许执行任意可执行文件的实用程序:

static int Main(string[] args)
{
  // Check your arguments here

  string path = args[0];
  string executable = args[1];
  path = Path.GetDirectoryName(path);
  path = Path.Combine(path, executable);

  try
  {
    if(!File.Exists(path)) throw new FileNotFoundException();
    Process p = new Process()
    {
      StartInfo = new ProcessStartInfo(path)
    };
    p.Start();
    p.WaitForExit();
  }
  catch(Exception)
  {
    return -1;
  }
  return 0;
}

我作为安装过程的一部分启动了这个exe,其中包含我要安装的外部可执行文件的参数:

<ExePackage SourceFile="$(var.MyUtility.TargetDir)MyUtility.exe"
            Compressed="yes">
  <CommandLine InstallArgument="[WixBundleOriginalSource] Data\setup.exe"/>
</ExePackage>

我的外部安装程序必须位于相对于实际引导程序exe的。\ Data \中,但可以修改参数以指向任何路径。在大多数情况下,这也可以通过自定义操作完成;在我的情况下,外部exe正在安装SQL Server,当通过自定义操作启动安装时,它将挂起。

相关问题