WiX技巧和技巧

我们已经使用了一段时间的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="SoftwareCompanyProduct" Name="InstallLocation" />
     </Property>
    

    注意 :WiX大师Rob Mensching发布了一篇优秀的博客文章,详细介绍了当从命令行设置属性时的边缘情况。

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

    注意 :在WiX 3.5中有一个新的重要升级元素,使生活更加轻松!

  • 在添加/删除程序中创建一个图标

    <Icon Id="Company.ico" SourceFile="..ToolsCompanyImagesCompany.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="..DeploySetup$(OutputName) $(AssemblyFileVersion)_$(Platform).msi" />
    </Target>
    
  • 使用热量通过通配符(*)Guid收集文件。 如果您想在多个项目中重复使用WXS文件,请参阅此文档(有关同一产品的多个版本的答案)。 例如,这个批处理文件会自动收集RoboHelp输出。

    @echo off  
    robocopy ..WebHelp "%TEMP%WebHelpTempWebHelp" /E /NP /PURGE /XD .svn  
    "%WIX%binheat" 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关于每个文件一个组件的建议。 这也允许你省去(或通配符* )组件GUID。

  • Rob Mensching可以通过搜索value 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>
    

  • 检查IIS是否已安装:

    <Property Id="IIS_MAJOR_VERSION">
        <RegistrySearch Id="CheckIISVersion" Root="HKLM" Key="SOFTWAREMicrosoftInetStp" Name="MajorVersion" Type="raw" />
    </Property>
    
    <Condition Message="IIS must be installed">
        Installed OR IIS_MAJOR_VERSION
    </Condition>
    

    检查Vista +上是否安装了IIS 6元数据库兼容性:

    <Property Id="IIS_METABASE_COMPAT">
        <RegistrySearch Id="CheckIISMetabase" Root="HKLM" Key="SOFTWAREMicrosoftInetStpComponents" Name="ADSICompatibility" Type="raw" />
    </Property>
    
    <Condition Message="IIS 6 Metabase Compatibility feature must be installed">
        Installed OR ((VersionNT &lt; 600) OR IIS_METABASE_COMPAT)
    </Condition>
    

    将所有ID保存在不同的名称空间中

  • 功能以F.开头F.例如:F.Documentation,F.Binaries,F.SampleCode。
  • 组件以C.开头C.例如:C.ChmFile,C.ReleaseNotes,C.LicenseFile,C.IniFile,C.Registry
  • CustomActions是CA. 例如:CA.LaunchHelp,CA.UpdateReadyDlg,CA.SetPropertyX
  • 文件是Fi.
  • 目录是Di.
  • 等等。
  • 我发现这有助于在各种类别中跟踪所有各种ID的巨大帮助。

    链接地址: http://www.djcxy.com/p/61621.html

    上一篇: WiX tricks and tips

    下一篇: Visual Studio 2013 doesn't discover unit tests