创建本地化的 Windows Installer 和引导程序:第 4 部分






4.50/5 (4投票s)
本系列文章是使用一些实际需求构建可本地化 Windows Installer & Bootstrapper 的完整端到端解决方案。
- 第 1 部分:介绍 & 设置
- 第 2 部分:定义条件
- 第 3 部分:本地化
- 第 4 部分:提供先决条件
引言
在第 1, 2 和 3 部分,我们使用 Wix 工具创建了一个可本地化的 MSI 安装程序。 我们还创建了条件,以确保该应用程序只能安装在运行 Windows 7 和 Microsoft .NET Framework 4 Client Profile 的 Dell 硬件上。 在我们的原始需求中,我们声明这必须可作为单个文件部署,并且应该安装任何先决条件,特别是 .NET 4。 为此,我们需要创建一个 bootstrapper,它将从非托管代码执行先决条件安装。 bootstrapper 将作为单个自包含的 EXE
部署,原始 MSI 文件嵌入其中。
我研究了许多用于创建 bootstrapper 的实用程序,包括 Wix SETUPBLD
工具和 MSBuild GenerateBootStrapper
任务。 最后,我选择了名为 dotNetInstaller 的强大免费实用程序。 这允许创建高度可配置和可本地化的 bootstrapper,这些 bootstrapper 可以从命令行编译。
DotNetInstaller
DoNetInstaller 包含几个用于编写和编译 bootstrapper 的实用程序。 bootstrapper 由 InstallerLinker.exe 工具从单个 XML 配置文件编译。 要编写配置文件,会以 InstallerEditor.exe 的形式提供一个编辑器。
使用编辑器,可以通过 UI 快速设置语言变体,并通过添加子节点来定义先决条件。 任何先决条件安装程序都可以直接嵌入到 bootstrapper 中,或者提供一个 URL,从该 URL 下载并安装它们。 在我们的例子中,我们嵌入了 Microsoft .NET Framework 4 Client Profile 的 Web 安装程序。 这将启动安装过程并根据需要下载必要的组件,以减少 bootstrapper 的大小。
安装先决条件后,dotNetInstaller 允许我们定义一个自定义命令,以使用 complete_command
属性启动我们自己的嵌入式 MSI 文件。 我们可以为不同的语言设置不同的命令,因此在先决条件检查后显式地将转换传递给 MSI 文件。 如果找到所有先决条件,我们可以完全隐藏 bootstrapper 界面,并简单地启动 MSI 文件。
DotNetInstaller 包含其自己的基于用户或系统设置的自动语言检测。 为了利用这一点,我们可以在配置文件中引用一个 #LCID
标记,该标记将在运行时评估为检测到的 LCID
。 这允许我们显式地将 LCID
传递给我们的 MSI,以便启动特定的语言变体。
通过命令行,我们仍然可以将属性注入到我们的 MSI 中,例如用于覆盖硬件检查。 它的语法是
setup.exe /CompleteCommandArgs "SKIPCHECK=1"
dotNetInstaller 的功能太多,无法在本文中介绍,但有大量文档,并且功能非常丰富。
构建自动化
要完成我们的 bootstrapper,我们确实希望将其集成到我们的构建脚本中并注入参数,例如产品名称和版本。 为了实现这一点,我们可以使用 NAnt 脚本,该脚本在编译之前对 dotNetInstaller 配置文件执行标记替换。 我也可以同样使用 XML 操作,但 NAnt 使标记替换变得有些容易。
这使用带有 NAnt copy
任务的 filterchain
实现,如下所示。 原始配置文件被复制到新位置,在那里被修改,然后被解析到安装程序链接器。
<copy tofile="${installer.dir}\obj\${build.configuration}\Configuration.xml"
file="${installer.dir}\bootstrapper\Configuration.xml" overwrite="true"
inputencoding="utf-8"
outputencoding="utf-8"
>
<filterchain>
<replacetokens>
<token key="APPLICATION_MANUFACTURER" value="${project.companyname}" />
<token key="APPLICATION_NAME" value="${app.name}" />
<token key="APPLICATION_VERSION" value="v${version}" />
<token key="INSTALLER_VERSION" value="${installer.version}" />
<token key="INSTALLER_COPYRIGHT" value="Copyright ©
${datetime::get-year(datetime::now())} ${project.companyname}" />
<token key="MSI_PATH" value="${installer.dir}\bin\$
{build.configuration}\Setup.msi" />
</replacetokens>
<tabstospaces />
</filterchain>
</copy>
摘要
在最后一部分,我们已经满足了我们的原始需求,并提供了一个构建脚本,用于动态生成可本地化的安装程序和自包含的 bootstrapper。 所有源代码和脚本都作为此页面上的下载提供,我希望它对于演示现实世界中的技术很有用。 构建演示解决方案时,请不要忘记将源代码 Config.wsi 文件中的 GUID 替换为您自己的唯一 ID。
历史
- 2010年8月22日:初始发布