加快 WiX 安装程序的构建过程
Speed up Build-Process of WiX-Installer
对于我的 Wix 项目,我通过 visual studio 的预构建事件收集了 4 个目录,这将产生大约 160mb 的数据和大约 220 个文件,但是构建过程花费了很长时间.
我怎样才能加快这个过程?我有一个嵌入式 media.cab 文件,它将保存所有文件。是文件的大小还是数量会减慢进程?还是在建造前活动中使用加热工具进行收割?使用 HeatDirectory 元素会更快吗?
有人在加速这方面有经验吗?
简单地说,不要收集文件。请看我的博文:Dealing with very large number of files
The third downside is that your build will take A LOT longer to
perform since it's not only creating your package but that it's also
authoring and validating your component definitions.
我在 CodePlex 上维护一个名为 IsWiX 的开源项目。它包含项目模板(脚手架)和图形设计器,可帮助您设置和维护 WiX 源代码。也就是说,它是围绕合并模块设计的,这会减慢构建速度,因为必须构建 .MSM,然后将其合并到 .MSI 中。如果您真的关心纯速度,纯片段会更快。那就是说我有很多安装程序,大约 160mb,而且根本不需要很长时间。
当然不要忘记拥有一台快速构建的机器。 CPU、RAM 和 SSD 磁盘 I/O 都有助于快速生成 MSI。对于我的咨询,我使用 Microsoft Visual Studio Online (VSO)。我有一台 Core i7-2600k Hyper-V 服务器,配备 32GB 内存和三星 850evo SSD。我的构建服务器 (VM) 运行用于本地 SCC 缓存的 TFS 代理服务器。
为了好玩,在上面的机器上,我从我的 system32 文件夹中取出了 220 个文件,总计 160MB。构建 MSM 需要 30 秒,构建 MSI 需要 30 秒,总共需要 60 秒。这对我来说是 'fast enough'。我预计仅使用片段编写的 MSI 需要 30 秒。
WiX Help File: How To: Optimize build speed. In other words: 1)
Cabinet reuse
and 2)
multi-threaded cab creation
are built-in mechanisms in WiX to speed up builds.
硬件:不可避免的"throw hardware at it"
。新的 SSD
和 NVMe
磁盘比您可能想要的旧 IDE 驱动器快得多尝试将它们作为另一种提高构建速度和安装速度的方法。很明显是的,但非常重要。确实可以提高开发速度。 .
NVMe 驱动器的挑战?:1)
他们运行 热,2)
他们通常容量(大小)有限,3)
他们可能比旧的更容易受到攻击用于笔记本电脑的 2.5" 驱动器(我不确定 - 请记住,某些 NVMe 驱动器已牢固焊接到笔记本电脑的主板上),4)
数据救援可能是如果你没有高质量的外壳(外形等),有点挑战,5)
NVMe 驱动器据说会随着时间的推移而烧坏,6)
它们仍然有点贵 - 尤其是容量较大的,而且肯定还有进一步的挑战 - 但总的来说:这些驱动器很棒。
Compression:您可以尝试使用不同的 compression level (for example none 来编译您的设置 调试构建)。没有压缩使构建更快。以下是相反的说明,设置更高的压缩率(只需使用 none 而不是高压缩率):
CompressionLevel
: Msi two times larger than msm
MediaTemplate
: How can I reduce the size of a 1GB MSI file using Orca?
关于压缩的相关回答:What is the compression method used by MSI files?
单独设置:如果你仍然压缩,你可以把先决条件和在单独设置中合并模块以避免为每个构建压缩它们(或者如果你在Installshield中使用发布标志,或者检查Preprocessor Wix 中的功能)。
外部源文件:我想你可以使用外部源文件,如果可以的话- 那么在构建过程中你就不会进行冗长的压缩操作,只有一个文件副本(它会变得越来越快 - 特别是闪存驱动器)。
Shim:另一种技术是 shim 您安装的所有文件都是 1 KB 如果您要测试的是设置本身及其 GUI 和自定义操作。然后它只是一个设置的“shell” - 这是测试新的自定义操作到您的设置的好方法。许多人为此编写了工具,但我没有 link 给你。总有github.com可以搜索
Release Flags:另一种节省时间的方法是使用特殊的release flags(仅限 Installshield)来编译您当前正在处理的设置的较小版本(省略许多功能)。 WiX 通过其 preprocessor. More on WiX preprocessor practical use.
具有类似的可能性
调试构建:我通常使用这些技术的组合来制作调试构建 .
- 我通常在试验和添加新功能时使用外部源文件,并且一直在重建和安装设置。
- 仅编译部分设置的发布标志、cabinet 重用和发布标志的组合可以节省大量时间,具体取决于您的设置大小、文件数量和硬件配置。
- 在我看来,也许最有效的是单独设置(前提是它稳定且不经常更改)。但要注意:Wix to Install multiple Applications(拆分设置时涉及的问题)。
我的看法:进行仅先决条件的单独设置。这也适用于 大规模部署方案 ,在这种情况下,企业用户希望使用他们自己的标准化先决条件,并且对大型设置中的大量嵌入式“垃圾”感到恼火。大公司的大量包准备时间都花在了删除过时的 运行 时间和先决条件上。您还可以在不重建整个设置的情况下交付对这些先决条件的更新。良好的解耦。
链接:
对我们来说,绝大部分时间花在调用 light
(用于链接阶段)。
light
压缩机柜时非常慢。将 .wixproj 中的 DefaultCompressionLevel
从 high
更改为 mszip
(或 low
或 none
)有很大帮助。但是,我们的构建还是太慢了。
原来light
独立处理柜子,默认多线程自动链接。要利用这种并行性,您需要生成多个机柜。在我们的 .wxs Product
元素中,我们将以下内容放在一个柜子中:
<MediaTemplate EmbedCab="yes" />
事实证明,您可以使用 MaximumUncompressedMediaSize
属性来声明您希望文件自动分片到不同 .cab 文件的阈值(以 MB 为单位):
<MediaTemplate EmbedCab="yes" MaximumUncompressedMediaSize="2" />
现在 light
快得多,即使使用 high
压缩,但对于增量构建(只有少数文件更改)仍然不够快。
回到 .wixproj 中,我们可以使用以下内容来设置文件柜缓存,这对于文件更改很少且大多数文件柜不需要重新生成的增量构建是理想的:
<CabinetCachePath>$(OutputPath)cabcache\</CabinetCachePath>
<ReuseCabinetCache>True</ReuseCabinetCache>
抑制验证也提供了很好的加速(light.exe 默认情况下花费大约三分之一的时间来验证 .msi)。我们为调试版本激活它:
<SuppressValidation>True</SuppressValidation>
通过这些更改,对于 32 MB .msi 输出,我们的最终(增量)构建从一分多钟缩短到几秒,并且完全重建保持在一分钟内,即使使用 high
压缩级别。
对于我的 Wix 项目,我通过 visual studio 的预构建事件收集了 4 个目录,这将产生大约 160mb 的数据和大约 220 个文件,但是构建过程花费了很长时间.
我怎样才能加快这个过程?我有一个嵌入式 media.cab 文件,它将保存所有文件。是文件的大小还是数量会减慢进程?还是在建造前活动中使用加热工具进行收割?使用 HeatDirectory 元素会更快吗?
有人在加速这方面有经验吗?
简单地说,不要收集文件。请看我的博文:Dealing with very large number of files
The third downside is that your build will take A LOT longer to perform since it's not only creating your package but that it's also authoring and validating your component definitions.
我在 CodePlex 上维护一个名为 IsWiX 的开源项目。它包含项目模板(脚手架)和图形设计器,可帮助您设置和维护 WiX 源代码。也就是说,它是围绕合并模块设计的,这会减慢构建速度,因为必须构建 .MSM,然后将其合并到 .MSI 中。如果您真的关心纯速度,纯片段会更快。那就是说我有很多安装程序,大约 160mb,而且根本不需要很长时间。
当然不要忘记拥有一台快速构建的机器。 CPU、RAM 和 SSD 磁盘 I/O 都有助于快速生成 MSI。对于我的咨询,我使用 Microsoft Visual Studio Online (VSO)。我有一台 Core i7-2600k Hyper-V 服务器,配备 32GB 内存和三星 850evo SSD。我的构建服务器 (VM) 运行用于本地 SCC 缓存的 TFS 代理服务器。
为了好玩,在上面的机器上,我从我的 system32 文件夹中取出了 220 个文件,总计 160MB。构建 MSM 需要 30 秒,构建 MSI 需要 30 秒,总共需要 60 秒。这对我来说是 'fast enough'。我预计仅使用片段编写的 MSI 需要 30 秒。
WiX Help File: How To: Optimize build speed. In other words:
1)
Cabinet reuse
and2)
multi-threaded cab creation
are built-in mechanisms in WiX to speed up builds.
硬件:不可避免的"throw hardware at it"
。新的 SSD
和 NVMe
磁盘比您可能想要的旧 IDE 驱动器快得多尝试将它们作为另一种提高构建速度和安装速度的方法。很明显是的,但非常重要。确实可以提高开发速度。
NVMe 驱动器的挑战?:1)
他们运行 热,2)
他们通常容量(大小)有限,3)
他们可能比旧的更容易受到攻击用于笔记本电脑的 2.5" 驱动器(我不确定 - 请记住,某些 NVMe 驱动器已牢固焊接到笔记本电脑的主板上),4)
数据救援可能是如果你没有高质量的外壳(外形等),有点挑战,5)
NVMe 驱动器据说会随着时间的推移而烧坏,6)
它们仍然有点贵 - 尤其是容量较大的,而且肯定还有进一步的挑战 - 但总的来说:这些驱动器很棒。
Compression:您可以尝试使用不同的 compression level (for example none 来编译您的设置 调试构建)。没有压缩使构建更快。以下是相反的说明,设置更高的压缩率(只需使用 none 而不是高压缩率):
CompressionLevel
: Msi two times larger than msmMediaTemplate
: How can I reduce the size of a 1GB MSI file using Orca?
关于压缩的相关回答:What is the compression method used by MSI files?
单独设置:如果你仍然压缩,你可以把先决条件和在单独设置中合并模块以避免为每个构建压缩它们(或者如果你在Installshield中使用发布标志,或者检查Preprocessor Wix 中的功能)。
外部源文件:我想你可以使用外部源文件,如果可以的话- 那么在构建过程中你就不会进行冗长的压缩操作,只有一个文件副本(它会变得越来越快 - 特别是闪存驱动器)。
Shim:另一种技术是 shim 您安装的所有文件都是 1 KB 如果您要测试的是设置本身及其 GUI 和自定义操作。然后它只是一个设置的“shell” - 这是测试新的自定义操作到您的设置的好方法。许多人为此编写了工具,但我没有 link 给你。总有github.com可以搜索
Release Flags:另一种节省时间的方法是使用特殊的release flags(仅限 Installshield)来编译您当前正在处理的设置的较小版本(省略许多功能)。 WiX 通过其 preprocessor. More on WiX preprocessor practical use.
具有类似的可能性调试构建:我通常使用这些技术的组合来制作调试构建 .
- 我通常在试验和添加新功能时使用外部源文件,并且一直在重建和安装设置。
- 仅编译部分设置的发布标志、cabinet 重用和发布标志的组合可以节省大量时间,具体取决于您的设置大小、文件数量和硬件配置。
- 在我看来,也许最有效的是单独设置(前提是它稳定且不经常更改)。但要注意:Wix to Install multiple Applications(拆分设置时涉及的问题)。
我的看法:进行仅先决条件的单独设置。这也适用于 大规模部署方案 ,在这种情况下,企业用户希望使用他们自己的标准化先决条件,并且对大型设置中的大量嵌入式“垃圾”感到恼火。大公司的大量包准备时间都花在了删除过时的 运行 时间和先决条件上。您还可以在不重建整个设置的情况下交付对这些先决条件的更新。良好的解耦。
链接:
对我们来说,绝大部分时间花在调用 light
(用于链接阶段)。
light
压缩机柜时非常慢。将 .wixproj 中的 DefaultCompressionLevel
从 high
更改为 mszip
(或 low
或 none
)有很大帮助。但是,我们的构建还是太慢了。
原来light
独立处理柜子,默认多线程自动链接。要利用这种并行性,您需要生成多个机柜。在我们的 .wxs Product
元素中,我们将以下内容放在一个柜子中:
<MediaTemplate EmbedCab="yes" />
事实证明,您可以使用 MaximumUncompressedMediaSize
属性来声明您希望文件自动分片到不同 .cab 文件的阈值(以 MB 为单位):
<MediaTemplate EmbedCab="yes" MaximumUncompressedMediaSize="2" />
现在 light
快得多,即使使用 high
压缩,但对于增量构建(只有少数文件更改)仍然不够快。
回到 .wixproj 中,我们可以使用以下内容来设置文件柜缓存,这对于文件更改很少且大多数文件柜不需要重新生成的增量构建是理想的:
<CabinetCachePath>$(OutputPath)cabcache\</CabinetCachePath>
<ReuseCabinetCache>True</ReuseCabinetCache>
抑制验证也提供了很好的加速(light.exe 默认情况下花费大约三分之一的时间来验证 .msi)。我们为调试版本激活它:
<SuppressValidation>True</SuppressValidation>
通过这些更改,对于 32 MB .msi 输出,我们的最终(增量)构建从一分多钟缩短到几秒,并且完全重建保持在一分钟内,即使使用 high
压缩级别。