对我们而言,绝大部分时间都花在了调用light
(用于链接阶段)上。
light
在压缩cabinet时非常慢。将.wixproj中的DefaultCompressionLevel
从high
改为mszip
(或low
或none
),可以很大程度上帮助加快构建速度。但是,我们的构建速度仍然太慢了。
事实证明,light
独立处理cabinet,并默认通过多个线程进行链接。要利用这种并行性,您需要生成多个cabinet。在我们的.wxs Product
元素中,我们有以下内容将所有内容放在单个cabinet中:
<MediaTemplate EmbedCab="yes" />
原来您可以使用MaximumUncompressedMediaSize
属性来声明文件自动分裂为不同的.cab文件的阈值(以MB为单位):
<MediaTemplate EmbedCab="yes" MaximumUncompressedMediaSize="2" />
light
速度也更快了,但对于增量构建(只有少数文件发生更改)仍然不够快。<CabinetCachePath>$(OutputPath)cabcache\</CabinetCachePath>
<ReuseCabinetCache>True</ReuseCabinetCache>
禁用验证还能提高速度(默认情况下,light.exe 要花费约三分之一的时间来验证 .msi)。我们会在调试版本中启用此功能:
<SuppressValidation>True</SuppressValidation>
通过这些改变,我们的最终(增量)构建时间从一分钟以上缩短到了几秒钟,对于一个32 MB的.msi输出文件,即使使用高压缩级别,完全重新构建的时间也保持在一分钟以下。
简单来说,不要收集文件。请参考我的博客文章:处理大量文件的方法
第三个缺点是,由于它不仅在创建软件包,还在编写和验证组件定义,因此您的构建时间将非常长。
我在CodePlex上维护一个开源项目,名为IsWiX。它包含项目模板(脚手架)和图形化设计工具,帮助您设置和维护WiX源代码。话虽如此,它是基于合并模块设计的,这会使构建速度有所下降,因为必须先构建.MSM,然后再将其合并到.MSI中。如果您真的关心纯速度,那么使用纯碎片会更快。话虽如此,我有许多安装程序大小约为160mb,但用时很短。
当然,别忘了拥有一台快速的构建机器。 CPU、RAM和SSD磁盘I/O都有助于快速生成MSIs。在我的咨询中,我使用Microsoft Visual Studio Online (VSO)。我有一台Core i7-2600k Hyper-V服务器,配备32GB内存和三星850evo SSD。我的构建服务器(VM)运行TFS代理服务器,用于本地SCC缓存。WiX帮助文件:如何优化构建速度。换句话说:
1)
柜子重用
和2)
多线程制作柜子
是WiX中内置的机制,可加快构建速度。
"扔硬件加速"
。新的SSD
和NVMe
磁盘比旧的IDE驱动器快得多,因此您可能希望尝试它们作为改善构建速度和安装速度的另一种方式。显而易见,但非常重要。它确实可以提高开发速度。请参阅此答案。压缩:您可以尝试使用不同的压缩级别编译设置(例如,对于调试构建,使用none)。不压缩会使构建速度更快。这里有一些示例来进行相反的操作,设置更高的压缩级别(只需将“high”替换为“none”即可):
CompressionLevel
:Msi two times larger than msmMediaTemplate
:How can I reduce the size of a 1GB MSI file using Orca?关于压缩的相关回答:MSI文件使用的压缩方法是什么?
单独设置:如果您仍然选择压缩,可以将前提条件和合并模块放在单独的安装包中,以避免为每个构建压缩它们(或者在Installshield中使用发布标志,或者在Wix中检查预处理器功能)。
外部源文件:我想如果这是可接受的,您可以使用外部源文件 - 然后在构建过程中不需要进行冗长的压缩操作,只需进行文件复制(特别是使用闪存驱动器会更快)。
Shim:另一种技术是将您安装的所有文件都“shim”为“1 KB”,如果您要测试的是设置本身及其GUI和自定义操作,则可以使用该技术。然后它只是一个设置的“外壳” - 这是测试新自定义操作的绝佳方式。许多人已经为此编写了工具,但我没有提供链接。总有github.com可供搜索。调试版本: 我通常使用这些技术的组合来制作一个调试版本。
我的看法: 选择仅先决条件的单独设置。这对于企业用户想要使用自己的标准化先决条件并对巨大设置中嵌入的“垃圾”感到恼火的大规模部署场景也很有用。大公司在包准备上花费了很多时间去除过时的运行时和先决条件。您还可以向这些先决条件提供更新而无需重新构建整个设置。良好的解耦。
链接: