WiX 技巧和技巧

标签 wix wix3.5 wix3

我们已经使用 WiX 一段时间了,尽管人们常常提示易用性,但它的运行情况相当不错。我正在寻找有关以下方面的有用建议:

  • 设置 WiX 项目(布局、引用、文件模式)
  • 将 WiX 集成到解决方案以及构建/发布流程中
  • 为新安装和升级配置安装程序
  • 您想分享的任何好的 WiX 技巧

最佳答案

  1. 将变量保存在单独的 wxi 包含文件中。允许重用,可以更快地查找变量,并且(如果需要)可以更轻松地通过外部工具进行操作。

  2. 为 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 ?>
    
  3. 将安装位置存储在注册表中,以便升级时能够找到正确的位置。例如,如果用户设置自定义安装目录。

     <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)">
    
  4. 最简单的方法总是 major upgrades ,因为它允许在单个 MSI 中进行新安装和升级。 UpgradeCode固定为唯一的 Guid 并且永远不会改变,除非我们不想升级现有产品。

    注意:在 WiX 3.5 中,有一个新的 MajorUpgrade构成生命的元素even easier !

  5. 在“添加/删除程序”中创建图标

    <Icon Id="Company.ico" SourceFile="..\Tools\Company\Images\Company.ico" />
    <Property Id="ARPPRODUCTICON" Value="Company.ico" />
    <Property Id="ARPHELPLINK" Value="http://www.example.com/" />
    
  6. 在发布版本中,我们对安装程序进行版本控制,将 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>
    
  7. 使用热度来收获带有通配符 (*) 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 部署输出)。

  8. 通过使用 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>
    
  9. 为了避免一些痛苦,请遵循 Wim Coehen's advice每个文件一个组件。这还允许您省略(或通配符 *)component GUID .

  10. Rob Mensching 有一个 neat way通过搜索值 3 快速跟踪 MSI 日志文件中的问题。请注意有关国际化的评论。

  11. 添加条件功能时,将默认功能级别设置为 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/

相关文章:

properties - 如何指定c :\users\public (%PUBLIC%) in WiX?

properties - 在卸载日志中找不到 WiX 属性

image - WiX位图是否可以使用.png图像

c# - 我怎么知道exe的安装路径?

WiX Burn 3.6 beta - 自定义 UI 示例

wix - 自定义操作中的条件

WiX CustomAction ExeCommand 失败?

wix - 使用 WiX 卸载后重新启动

.net - 通过 WiX 3 检测程序集是否位于 GAC 中?

wix - 为什么在使用 Wix 安装后运行应用程序时出现 "and NOT installed"?