将变量保存在单独的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>
Note: WiX 大师罗布·门兴 https://stackoverflow.com/users/23852/rob-mensching已发布优秀的博客条目 http://robmensching.com/blog/posts/2010/5/2/The-WiX-toolsets-Remember-Property-pattern它提供了更多细节,并修复了从命令行设置属性时的边缘情况。
使用 1. 2. 和 3. 的示例
<?include $(sys.CURRENTDIR)\Config.wxi?>
<Product ... >
<Package InstallerVersion="200" InstallPrivileges="elevated"
InstallScope="perMachine" Platform="$(var.Platform)"
Compressed="yes" Description="$(var.ProductName)" />
and
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.PlatformProgramFilesFolder)">
<Directory Id="INSTALLLOCATION" Name="$(var.InstallName)">
-
最简单的方法总是主要升级 http://blogs.technet.com/b/alexshev/archive/2008/02/15/from-msi-to-wix-part-8-major-upgrade.aspx,因为它允许在单个 MSI 中进行新安装和升级。升级代码 https://stackoverflow.com/questions/114165/how-to-implement-wix-installer-upgrade/724098#724098固定为唯一的 Guid 并且永远不会改变,除非我们不想升级现有产品。
Note:在 WiX 3.5 中有一个新的重大升级 http://wix.sourceforge.net/manual-wix3/wix_xsd_majorupgrade.htm构成生命的元素甚至更容易 http://www.joyofsetup.com/2010/01/16/major-upgrades-now-easier-than-ever/!
-
在“添加/删除程序”中创建图标
<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>
-
使用热度来收获带有通配符(*)指导的文件。如果您想在多个项目中重用 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 进行本地化,可以轻松地将产品版本包含在欢迎对话框标题中。 (信用:萨沙·博蒙特 https://stackoverflow.com/users/592/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>
为自己省去一些痛苦并遵循维姆·科恩的建议 https://stackoverflow.com/questions/1602831/wix-one-file-per-component-or-several-files-per-component/1604348#1604348每个文件一个组件。这也允许您省略(或通配符*
) the 组件GUID http://wix.sourceforge.net/manual-wix3/wix_xsd_component.htm.
罗布·门兴有一个neat way http://robmensching.com/blog/posts/2010/8/2/The-first-thing-I-do-with-an-MSI-log通过搜索快速跟踪 MSI 日志文件中的问题value 3
。请注意有关国际化的评论。
-
添加条件功能时,更直观的做法是将默认功能级别设置为 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>