如何使用 Burn Bootstrap 应用程序安装本地化的 MsiPackage

Posted

技术标签:

【中文标题】如何使用 Burn Bootstrap 应用程序安装本地化的 MsiPackage【英文标题】:How to install a localized MsiPackage with Burn Bootstrap Application 【发布时间】:2016-07-14 10:18:50 【问题描述】:

我有许多本地化的 MSI 软件包。假设本地化的是开始菜单条目,使用 !(loc.StartAppDescription)。

在 MSI 中使用 WiX 完成此操作似乎是合理的。所以我已经这样做了,并且我已经根据基线 en-US 版本生成了许多转换,并将其嵌入到最终的 MSI MyCoolApp-1.2.123.0.msi 中。

转换可以与 MsiPackage 中 Name="TRANSFORM" Value=":it-IT" 的 MsiProperty 元素一起使用。

按照建议,每个本地化 MSI 都有一个自动生成的 ProductCode,因此转换也会导致此处与实际文本一起发生变化。

然后,我使用基于 InstallCondition 的标准引导程序应用程序构建了一个刻录引导程序,它将选择 x86 或 x64 版本的安装程序。此引导程序也已本地化。

引导程序本地化工作正常。 MSI 包本地化工作正常。

但是,我该如何将它们组合在一起呢?

似乎没有办法在刻录链中实际使用本地化 MSI。这甚至说不通。为什么要花费如此多的时间和精力来使 Windows 安装程序本地化成为可能,并通过 Burn 和标准引导应用程序使安装过程的 UI 可本地化,然后又无法使用另一个?

我错过了什么?通过 wix 邮件列表,我得到了一个权威回复,基本上说“Burn 不支持通过 MsiPackage 转换进行本地化,并且实现起来并不简单”(不是字面引用,我的解释)。仍然没有关于如何实际实现我所追求的建议或提示:根据 Burn 的用户文化安装几个可能的本地化 MSI 之一。

我基本上尝试过这里描述的操作:http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/My-experiences-making-a-multi-language-bundle-td7208949.html,它使用 InstallConditions 来确定用于安装的长链转换中的转换。这不起作用,因为升级和卸载方案以各种方式中断。

另外,由于我已经有数百万用户安装了非本地化 MSI(在新场景中是 en-US 基线),我需要能够升级这些现有用户,所以所有本地化MSI 需要与许多系统中已安装的现有 MSI 具有相同的升级代码。

是的,我也尝试了上述方法,但没有实际使用转换,而是完全本地化的 MSI 包。仍然没有设置的乐趣,只是一个更大的安装程序。

真的没有人需要从 Burn Bootstrapper 运行本地化的 MSI 包,并且成功地创建了这样的东西吗?

这似乎是 Burn 101 课程中的内容:如何制作一个 Burn 引导程序来安装本地化的 MsiPackage?

我是否遗漏了一些非常明显的东西?

【问题讨论】:

【参考方案1】:

是否要求您的不同语言产品可以安装 SxS?

如果没有,请在转换中删除 ProductCode 的更改。 Burn 遇到的问题之一是它依赖于 ProductCode 和 UpgradeCode 的未转换 MSI 值在安装软件包时完全相同。

在 Burn 中,您需要运行自己的自定义代码来设置 burn/bundle 变量,您将使用该变量来设置将传递给包的 TRANSFORMS msi 属性(以及与您发现必须使用的语言相关的任何其他属性)传入)。这可能意味着创建您自己的自定义 BA(我还没有让 BA 功能工作,所以我不知道这是否可行,尽管这似乎是一个完美的解决方案)。

【讨论】:

谢谢!不,SxS 不是必需的。您能否详细说明“[burn] 取决于安装软件包时 ProductCode 和 UpgradeCode 的未转换 MSI 值完全相同”的说法吗?您的意思是说 Burn 检查未转换的 MSI,并据此做出决定,并且转换后的 MSI 必须在转换后具有相同的 ProductCode(和 UpgradeCode)? 另外,如果 ProductCode 问题解决了,下一个问题确实是确保传递给 TRANSFORMS 属性的参数是基于用户文化/语言的有效转换。 UserLanguageID 和 WixStdBALanguageId 都可以使用,但我仍然需要一些函数来实现回退,否则它可能不会引用有效的转换。如果我理解正确,可以将变量传递给 MsiProperty 属性,例如 Value=":[WixStdBALanguageId]"? 构建捆绑包时,会读取 MSI 以检索存储在捆绑包内部元数据中的代码。目前不支持在该操作期间提取/应用任何转换。在操作的检测阶段使用该信息(以了解软件包是否已安装,或者是否会升级甚至降级已安装的软件包)。 如果您的包实现了与您的包完全相同的一组语言,那么您的包最终向用户显示的语言应该适合您。否则,是的,您将需要跟踪您为每个包实现的任何语言并自己确定后备。与以前的版本相比,WiX 4.0 和 3.11 版本的自动语言检测(包括回退)有了很大改进。 好的,太好了。它可能真的有效。但是为什么这么难!?因此,我将确保所有本地化 + 基线的 ProductCode 和 UpgradeCode 相同。版本更改时新的。

以上是关于如何使用 Burn Bootstrap 应用程序安装本地化的 MsiPackage的主要内容,如果未能解决你的问题,请参考以下文章

Wix 3.7 Burn - 如何使用动态信息制作自定义启动画面

Wix/Burn - 不运行 MSIPackage 的条件,因此不卸载应用程序

Wix Burn,我如何允许降级?

如何将文件添加到 WiX Burn 中的 Container 元素?

如何为 Wix Burn 安装程序包含完整的 .NET 先决条件

自定义 WiX Burn 引导程序用户界面?