在转换中包含组件

Include components in transforms

我有一个包含以下结构的 wix 项目文件:

cultures
- en
  - profile.mo
- de
  - profile.mo
...

我正在创建几个包含本地化 MSI 字符串的 MSI 文件。

我想要实现的是 "de" 和其他语言的文件包含在特定的 MSI 文件中。

这将大大减少设置的整体大小。目前我正在使用基于本地化的条件:

<Component Id="compLangDePluginMo" Guid="{YOUR-GUID}" >
    <Condition><![CDATA["!(loc.Localization)" = "de-de"]]></Condition>
    <File Id="fLangDePluginMo" Name="plugin.mo" Source="$(var.ProjectRef.ProjectDir)catalogs\de\de.mo" />
</Component>

在每个 WXL 文件中都有一个像

这样的语句
<String Overridable="yes" Id="Localization">en-us</String>

<String Overridable="yes" Id="Localization">de-de</String>

缺点是所有 MSI 文件都包含所有特定于语言的文件。

P.S。 MO 文件只是一个例子。我们正在处理大约几 MB 的语言特定文件,因此没有机会只将消息包含在转换中。

您不能在转换中包含组件(因为文件需要进入文件 table、CAB 等)。

如果您有一个中性 MSI 文件,这意味着您将拥有每种语言的捆绑包,具有功能的中性 MSI 和特定于语言的文件。因此,您可以为每种语言提供 WiX bundle/bootstrapper:中性 MSI 加一种语言。

为什么选择条件组件?在某些情况下,用户可以更改这些条件,并且修复会改变组件的安装状态(有时这是一个功能而不是错误)。作为特征的语言可能更具有预测性table。

还有一个用于所有语言特定数据的单独 MSI 可能很有用,这样功能就可以改变,但语言 MSI 不需要重建——尽管不会减小大小,这似乎是问题所在。

另一个注意事项:有时使用限定组件来提供此功能,例如,应用程序可以使用 MsiProvideQualifiedComponentEx 安装适当的语言文件,但我不确定如果您的产品是否对您有帮助不是多语言(但它是单一语言)。

如果您正在考虑转换,不妨从头到尾查看补丁。您可以拥有没有语言的基本 MSI 和另一个包含(例如)de-de 更改的 "identical" MSI(只要您对组件小心),然后为基本 MSI 提供每种语言的补丁, 根据系统打补丁。捆绑包可以应用基础加上适当的补丁。还可以将补丁应用到管理安装,这样您就可以得到一个可安装的映像,但带有松散的文件,如果那是 acceptable。

Chris 关于添加松散外部文件的转换提出了一个有趣的观点,但目前还不清楚(至少对我而言)考虑到基本 MSI 所需的更改(标记混合文件、处理文件哈希等)是否真的可行在)。