15

一年多前,我在 Visual Studio 2010 中创建了一个 WIX 项目。它会创建一个 MSI 文件和一个引导程序 setup.exe。实际上,它为两种语言(英语和法语)创建了这对文件。我刚刚将此项目集成到我们的 TFS CI 构建中。我无法让 CI 构建生成引导程序 setup.exe 文件。

我们最近将所有构建服务器上的 Wix 升级到了 Wix 3.6 RC。所以,我想我会尝试一下 Burn,而不是使用旧风格的引导程序。我在我的解决方案中添加了一个新的 Bootstrapper 项目。引导程序项目包括一个简单的 bundle.wxs,它只加载我的旧 MSI 项目生成的 MSI。但是,当我尝试构建时,出现以下错误:

错误 LGHT0103:系统找不到文件 'C:\Tf\Advantage\Dev\Solution\Configuration\LaunchPad.Wix\bin\Release\fr-fr\LaunchPad.msi;C:\Tf\Advantage\Dev\Solution\配置\LaunchPad.Wix\bin\Release\en-us\LaunchPad.msi'。

我在捆绑包中的包参考如下所示:

<MsiPackage Id="MyApplication" SourceFile="$(var.LaunchPad.Wix.TargetPath)" />

LaunchPad.Wix 是 Wix MSI 项目的名称。如果我将 LaunchPad.Wix 项目更改为仅构建一种语言,那么它可以正常工作。在我看来,引导程序项目类型只是不支持为多种语言构建设置文件。这是真的?任何解决方法的建议?

编辑

经过进一步调查,我想知道引导程序项目是否甚至支持本地化。我尝试将我的 Wix MSI 项目设置为仅创建 fr-fr。我的引导程序项目用英语创建的 setup.exe。当我编辑引导程序项目的项目属性时,“要构建的文化”字段被锁定并留空。我将如何构建一个非英语引导程序?这可能吗?

4

2 回答 2

22

这里有几件事:

  1. 如果您使用多个区域性,则不能在 MSBuild 之外需要单个文件名的内容中使用 TargetPath。如您所见,TargetPath 是已构建的本地化文件的列表。但是,如果您限定 .msi 包的输出语言,则可以使用 TargetPath:<MsiPackage SourceFile="$(var.TestMsi.en-US.TargetPath)" Id="MsiEnUs" />

  2. 如果您想创建一个可以安装 en-US 和 fr-FR 中的一个/两个的引导程序,则需要在其自己的 MsiPackage 元素中分别列出每个 .msi 包。

  3. 如果要创建两个引导程序,一个 en-US 和一个 fr-FR,则需要调用引导程序 .wixproj 两次,每种语言一次。引导程序不支持文化“技巧”——从一次 MSBuild 调用产生两个输出是有问题的(见证 TargetPath 问题)。

如果您使用的是 WixStandardBootstrapperApplication,它会自动尝试根据用户 UI 语言对 UI 进行本地化,然后回退到系统 UI 语言,最后回退到英语。它在以 LCID 命名的目录中查找本地化字符串,因此您将拥有如下有效负载:

<Payload Name="1033\thm.wxl" SourceFile="..." />
<Payload Name="1036\thm.wxl" SourceFile="..." />

不幸的是,WixStandardBootstrapperApplication 字符串目前仅适用于 en-US。这就是为什么 fr-FR 引导程序以英文显示 UI。您需要本地化 WiX 源文件 HyperlinkTheme.wxl 或 RtfTheme.wxl(取决于您使用的主题)。这两个文件都在 src\ext\BalExtension\wixstdba\Resources 中。

于 2012-07-09T20:04:49.597 回答
4

好的。正如鲍勃·阿恩森所说的那样。

但必须注意payload的名称和SourceFile。

<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
      <Payload Name="2052\thm.wxl" SourceFile="2052\thm.wxl" />
</BootstrapperApplicationRef>

如果您将名称更改为另一个名称。引导程序不会被本地化。

于 2013-04-11T15:27:11.990 回答