11

我在 WiX 3.7 版中设置了 32 位和 64 位版本。WiX 文档在充分解释这一点方面存在缺陷。在 的文档中Package/@Platform,它说“不鼓励使用此属性;相反,请在 candle.exe 命令行中指定 -arch 开关”,但没有解释此参数的实际作用(至少我找不到) . 编译器的“文档”完全值得在“文档”一词周围加上引号,因为它基本上是一个存根(例如,与链接器文档不同)。对于历史记录,这是编译器文档的全部内容:

Windows Installer XML 编译器由蜡烛.exe 公开。Candle 负责将输入的 .wxs 文件预处理为针对 WiX 模式 wix.xsd 的有效格式良好的 XML 文档。然后,每个后处理的源文件都被编译成一个 .wixobj 文件。

编译过程相对简单。WiX 模式适用于简单的递归下降解析器。编译器依次处理每个元素,创建新符号、计算必要的引用并为 .wixobj 文件生成原始数据。

命令行帮助提供了一些帮助,但还不够。

-arch      set architecture defaults for package, components, etc.
           values: x86, x64, or ia64 (default: x86)

在一个相关的问题中,WiX 3.0中的平台识别,有一个答案暗示了可能发生的事情,但这还不够,我不知道它是否准确。

  • 参数是否-arch与设置属性具有相同的效果Package/@Platform,还是做得更多?
  • 该参数是否影响预处理器中可用的任何内容?特别是,它是否设置了PLATFORM预处理器变量?它是否设置了其他任何东西?
  • 什么是架构“默认”?显式Package/@Platform属性是否覆盖命令行?或相反亦然?或者(更好的是)如果平台声明不一致,是否会出现错误?

其中一些问题的答案似乎应该是显而易见的,而且我确实在写下这个问题时学到了一些东西。但我想要一个明确的答案,最好(提示)一个指向candle命令行更新且准确的文档页面的链接。但是,我确实希望在有人回答时已经解决了这个问题,但是我会尽快节省其他人我花在解决这个问题上的时间。


另一个相关的问题,WIX:Package 元素的 Platform 属性真的被弃用了吗?, 谈论Package/@Platform属性,但没有解决命令行参数。
关于那个PLATFORM预处理器变量。现在显然是BUILDARCH,尽管您很难从文档中知道它。

warning CNDL1034 : The built-in preprocessor variable '$(sys.PLATFORM)' is 
deprecated. Please correct your authoring to use the new '$(sys.BUILDARCH)' 
preprocessor variable instead.
4

3 回答 3

10

以下代码片段启用了 32 位和 64 位版本之间的编译时配置,而无需引入代表平台的用户变量,而是使用系统提供的变量。这两个定义的变量对于普通安装都是通用的。64 位系统的最低版本更高。基本程序文件目录在 32 位和 64 位版本之间有所不同。

<?if $(sys.BUILDARCH)="x86"?>
    <?define Minimum_Version="100"?>
    <?define Program_Files="ProgramFilesFolder"?>
<?elseif $(sys.BUILDARCH)="x64"?>
    <?define Minimum_Version="200"?>
    <?define Program_Files="ProgramFiles64Folder"?>
<?else?>
    <?error Unsupported value of sys.BUILDARCH=$(sys.BUILDARCH)?>
<?endif?>


稍后在 WiX 源代码中使用这些定义。

<Package [...]
    InstallerVersion="$(var.Minimum_Version)"
/>

<Directory Id="$(var.Program_Files)">
    [...]
</Directory>
于 2013-05-17T16:12:30.900 回答
2

部分答案:

  • -arch参数确实设置了sys.BUILDARCH变量以及变量sys.PLATFORM
  • -arch参数默默地覆盖Package/@Platform属性。至少看起来是这样,如果看sys.BUILDARCH就足够了。
    • 因此命令行帮助是错误的。这是一个覆盖,而不是默认值。
于 2013-05-16T16:56:54.023 回答
0

除了定义 MSI 的体系结构(Package/@Platform)之外,它还为 MSI 中的 msidbComponentAttributes64bit 属性(WiX 中的 Win64)设置了默认组件表值。

IE。如果 sys.BUILDARCH = x86 则设置,如果 x64则已设置 (+256)。这在 WIX.chm 中没有提到,它只是重新迭代 MSI.chm 关于上述属性

将此属性设置为“是”以将其标记为 64 位组件。此属性有助于安装包含 32 位和 64 位组件的软件包。如果未设置此位,则组件注册为 32 位组件。** 如果这是替换 32 位组件的 64 位组件,请设置此位并在 Guid 属性中分配新的 GUID。

(所以不告诉你):使用 BUILDARCH 时,您只需要在想要覆盖默认值时编写 Win64 WiX 属性,这在从相同的 WiX 代码构建不同的拱 MSI 时很有帮助。在此之前,我对每个组件的 Win64 属性都使用了环境变量。

于 2015-07-06T15:37:07.823 回答