我们已经使用 WiX 一段时间了,尽管人们常常提示易用性,但它的运行情况相当不错。我正在寻找有关以下方面的有用建议:
- 设置 WiX 项目(布局、引用、文件模式)
- 将 WiX 集成到解决方案以及构建/发布流程中
- 为新安装和升级配置安装程序
- 您想分享的任何好的 WiX 技巧
最佳答案
将变量保存在单独的
wxi
包含文件中。允许重用,可以更快地查找变量,并且(如果需要)可以更轻松地通过外部工具进行操作。为 x86 和 x64 版本定义平台变量
<!-- Product name as you want it to appear in Add/Remove Programs--> <?if $(var.Platform) = x64 ?> <?define ProductName = "Product Name (64 bit)" ?> <?define Win64 = "yes" ?> <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?> <?else ?> <?define ProductName = "Product Name" ?> <?define Win64 = "no" ?> <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?> <?endif ?>
将安装位置存储在注册表中,以便升级时能够找到正确的位置。例如,如果用户设置自定义安装目录。
<Property Id="INSTALLLOCATION"> <RegistrySearch Id="RegistrySearch" Type="raw" Root="HKLM" Win64="$(var.Win64)" Key="Software\Company\Product" Name="InstallLocation" /> </Property>
注意:WiX 大师 Rob Mensching已发布excellent blog entry它提供了更多细节,并修复了从命令行设置属性时的边缘情况。
使用 1. 2. 和 3. 的示例
<?include $(sys.CURRENTDIR)\Config.wxi?> <Product ... > <Package InstallerVersion="200" InstallPrivileges="elevated" InstallScope="perMachine" Platform="$(var.Platform)" Compressed="yes" Description="$(var.ProductName)" />
和
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="$(var.PlatformProgramFilesFolder)"> <Directory Id="INSTALLLOCATION" Name="$(var.InstallName)">
最简单的方法总是 major upgrades ,因为它允许在单个 MSI 中进行新安装和升级。 UpgradeCode固定为唯一的 Guid 并且永远不会改变,除非我们不想升级现有产品。
注意:在 WiX 3.5 中,有一个新的 MajorUpgrade构成生命的元素even easier !
在“添加/删除程序”中创建图标
<Icon Id="Company.ico" SourceFile="..\Tools\Company\Images\Company.ico" /> <Property Id="ARPPRODUCTICON" Value="Company.ico" /> <Property Id="ARPHELPLINK" Value="http://www.example.com/" />
在发布版本中,我们对安装程序进行版本控制,将 msi 文件复制到部署目录。使用从 AfterBuild 目标调用的 wixproj 目标的示例:
<Target Name="CopyToDeploy" Condition="'$(Configuration)' == 'Release'"> <!-- Note we append AssemblyFileVersion, changing MSI file name only works with Major Upgrades --> <Copy SourceFiles="$(OutputPath)$(OutputName).msi" DestinationFiles="..\Deploy\Setup\$(OutputName) $(AssemblyFileVersion)_$(Platform).msi" /> </Target>
使用热度来收获带有通配符 (*) Guid 的文件。如果您想在多个项目中重用 WXS 文件,这很有用(请参阅我对同一产品的多个版本的回答)。例如,此批处理文件自动收集 RoboHelp 输出。
@echo off robocopy ..\WebHelp "%TEMP%\WebHelpTemp\WebHelp" /E /NP /PURGE /XD .svn "%WIX%bin\heat" dir "%TEMP%\WebHelp" -nologo -sfrag -suid -ag -srd -dir WebHelp -out WebHelp.wxs -cg WebHelpComponent -dr INSTALLLOCATION -var var.WebDeploySourceDir
发生了一些事情,
robocopy
正在收集之前剥离 Subversion 工作副本元数据;-dr
根目录引用设置为我们的安装位置而不是默认的 TARGETDIR;-var
用于创建变量来指定源目录(Web 部署输出)。通过使用 Strings.wxl 进行本地化,可以轻松地将产品版本包含在欢迎对话框标题中。 (来源:saschabeaumont。添加是因为这个很棒的提示隐藏在评论中)
<WixLocalization Culture="en-US" xmlns="http://schemas.microsoft.com/wix/2006/localization"> <String Id="WelcomeDlgTitle">{\WixUI_Font_Bigger}Welcome to the [ProductName] [ProductVersion] Setup Wizard</String> </WixLocalization>
为了避免一些痛苦,请遵循 Wim Coehen's advice每个文件一个组件。这还允许您省略(或通配符
*
)component GUID .Rob Mensching 有一个 neat way通过搜索
值 3
快速跟踪 MSI 日志文件中的问题。请注意有关国际化的评论。添加条件功能时,将默认功能级别设置为 0(禁用),然后将条件级别设置为所需值会更直观。如果您设置默认功能级别 >= 1,则条件级别必须为 0 才能禁用它,这意味着条件逻辑必须与您期望的相反,这可能会令人困惑:)
<Feature Id="NewInstallFeature" Level="0" Description="New installation feature" Absent="allow"> <Condition Level="1">NOT UPGRADEFOUND</Condition> </Feature> <Feature Id="UpgradeFeature" Level="0" Description="Upgrade feature" Absent="allow"> <Condition Level="1">UPGRADEFOUND</Condition> </Feature>
关于WiX 技巧和技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/471424/