Wix Bootstrapper 大包

Wix Bootstrapper with large package

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

light.exe(0,0): error LGHT0001: Arithmetic operation resulted in an overflow.

这是我当前在 bootstrapper:

中的相关 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 结合使用的方法,但也无济于事。

所以,问题是:我如何将这个非常大的 exe 包包含在我的安装程序中,使我可以将它安装在包链中,但不将它嵌入 bootstrap 数据文件中?

我对问题的解决方案:

我们不想跟踪外部 "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 服务器,当通过自定义操作启动安装时服务器会挂起。