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 服务器,当通过自定义操作启动安装时服务器会挂起。
我正在使用 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 服务器,当通过自定义操作启动安装时服务器会挂起。