WiX 技巧和技巧

2024-01-10

我们使用 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>
    

    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)">
    
  4. 最简单的方法总是主要升级 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/!

  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. 使用热度来收获带有通配符(*)指导的文件。如果您想在多个项目中重用 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 进行本地化,可以轻松地将产品版本包含在欢迎对话框标题中。 (信用:萨沙·博蒙特 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>
    
  9. 为自己省去一些痛苦并遵循维姆·科恩的建议 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.

  10. 罗布·门兴有一个neat way http://robmensching.com/blog/posts/2010/8/2/The-first-thing-I-do-with-an-MSI-log通过搜索快速跟踪 MSI 日志文件中的问题value 3。请注意有关国际化的评论。

  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>
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WiX 技巧和技巧 的相关文章

  • 显示目录列表控件中的文件

    有没有办法让用户使用 BrowseDlg 选择特定文件 我所能找到的是你只能选择一个文件夹 我相信文件选择是正在使用的 常见 功能之一 任何人都可以提供一些关于如何实现这一目标的建议 Thanks Update 我正在考虑为此创建一个 C
  • WiX:旧版本不会在“添加/删除程序”列表中消失

    我有一个使用 WiX 安装和升级的 Windows 服务 效果很好 非常快 唯一的问题是 如果我从 1 0 升级到 1 1 两个副本在 添加 删除程序 列表中仍然有条目 那么 当我执行更新时 如何确保 WiX 删除 添加 删除程序 列表中旧
  • msiexec 返回负数

    安装 MSI 时 我从 msiexec 收到奇怪的返回代码 即 2147021886 我想我记得在某处读到这是某种格式或编码问题 但我找不到参考 我还发现一个微软页面谈论 PS2 o 存在负返回码问题 但这种情况发生在 PS5 0 中 神奇
  • 如何使用 MajorUpgrade 和 RemoveFeatures 仅删除特定功能并仍然卸载产品的先前版本

    我从与 VS 2010 一起打包的 Microsoft 安装程序切换到 Wix 3 6 我试图通过使用
  • Wix 自定义操作仅在安装期间执行,但不在升级和删除时执行?

    我有一个自定义操作 该操作只能在安装期间执行 而不能在次要版本升级和删除期间执行 我尝试了不同的条件 但 CA 正在次要版本期间执行 1 未安装 或不 删除 全部 并升级产品代码 2 未安装 3 未安装 或未 已安装并删除 全部 并升级产品
  • 添加/删除程序中的 Wix 图标

    我正在使用 Wix 来创建我的安装程序 据官方称文档 http wixtoolset org documentation manual v3 howtos ui and localization configure arp appearan
  • 使用WiX安装后是否可以提示重启机器?

    使用WiX安装后是否可以提示重启机器
  • WIX 3.9 及更高版本的自定义操作 RegisterComPlus 发生错误

    在 Microsoft 我们长期以来一直使用 WIX 工具集版本 3 5 2519 0 来为我们名为 System Center Service Manager 又名 SCSM 的产品构建安装程序和补丁 最近我们需要更新到 WIX Tool
  • 如何使用 WiX 设置服务的恢复选项?

    我有以下 wxs 文件
  • 如何使用 WiX 安装和启动 Windows 服务

    我尝试在 Wix 中使用下面的代码 但是在安装时 安装程 序在 正在启动服务 状态下冻结了大约 3 分钟 然后我收到此消息 Service Jobservice 无法启动 请验证您是否有足够的权限来启动系统服务 我的代码有什么错误吗 并且可
  • 成功后动态改变EndDialog中的RTF内容

    多亏了这个question https stackoverflow com a 33679439 1076116 我能够执行自定义操作来临时更新和动态修改 MSI 数据库 简而言之 我正在做 CustomAction public stat
  • 如何确定现有应用程序的安装范围?

    我有一个基于的安装程序WixUI Advanced允许用户选择安装范围 每个用户或机器范围 升级时 安装了较低版本的现有应用程序 我想隐藏安装范围屏幕并自动选择他们上次选择的安装范围 如何判断先前安装使用的安装范围 Edit 查看我的 MS
  • WiX 在构建服务器上失败

    我有一个使用 WiX 的项目 它在我的本地计算机上运行良好 但是当我发布到构建服务器时 构建会因以下内容而崩溃 来自 MSBuild 日志 Using HeatDirectory task from assembly C Program F
  • 当自动为 WIX 安装程序收集文件时,我的目录结构有多灵活?

    请原谅我的无知 我一直在阅读一些书 但还没有准备好尝试任何东西 目前 我们有一个 wxs 文件 该文件无法轻松维护 每当从 SVN 提交 删除新文件时 都会手动添加 删除所有文件 由于在创建新文件和更新 wxs 安装文件之间发生了失误 我们
  • 如何使用自定义操作在 WiX 中运行脚本 - 最简单的示例?

    WiX新手问题 我该怎么办1 将一次性 shell 脚本与安装程序一起复制到 temp e g
  • 使用 WiX 将程序集放入 GAC 和安装路径中

    我刚刚开始学习如何使用 WiX 但遇到了障碍 我的软件包使用第三方库 该库要求 GAC 和软件包安装目录中都存在一些文件 使用 WiX 我可以使文件显示在安装目录或 GAC 中 但不能同时显示在两者中 有什么办法可以解决这个问题吗 这里有一
  • 如何创建 heat.exe 收集的文件的快捷方式?

    使用 WiX Toolset 3 10 并尝试创建已使用 WiX Toolset 收获的某些文件的快捷方式heat exe效用 如 WIX bin heat exe dir SourceDir nologo platform x64 ke
  • 使用 元素通过 Wix 运行 SQL 脚本文件

    我是 Wix 安装程序的新手 我有一个要求 必须提供 SQL Server 登录凭据并从特定路径运行脚本 我不明白出了什么问题 项目已成功构建并创建了 msi 运行后我收到以下错误 错误26204 错误 2147217900 无法执行SQL
  • Wix:动态添加功能

    我们正在使用 Wix 为我们的软件构建 msi 我们有一些要在目标机器上实现的组件 插件 每个客户端的插件都不同 我们想要做的是创建一个标准构建并修改 msi 包中的功能列表 有没有办法通过自定义操作动态更改功能列表 例如 从自定义操作中读
  • 让 WIX 在项目中包含引用

    我对 WiX 和设置自定义安装程序完全陌生 所以我对问题的主题表示歉意 我有一个内部业务应用程序 日记 它构建并运行良好 因此我按照教程 官方文档添加 WiX 项目并引用日记的 csproj 然后构建并运行这个最基本版本的 WiX 安装程序

随机推荐

  • cmake 设置用于 boost 的链接器标志

    我正在尝试编译一个 boost 教程示例http www boost org doc libs 1 36 0 doc html boost asio tutorial tutimer1 html http www boost org doc
  • 线程与线程池

    使用新线程和使用线程池中的线程有什么区别 有哪些性能优势 为什么我应该考虑使用池中的线程而不是我显式创建的线程 我在这里特别考虑的是 NET 但一般的例子就可以了 线程池将为频繁且相对较短的操作提供好处 重用已创建的线程而不是创建新线程 一
  • Azure 通用 v2 存储帐户和 BlockBlobStorage 帐户之间的差异有何解释?

    我想在 Azure 中创建一些新的存储帐户 当然 我想知道针对不同情况哪种最适合且最便宜 据我所知 唯一与我相关的帐户是 通用 v2 帐户 https learn microsoft com de de azure storage comm
  • Azure CLI 存储集 cors - 意外令牌

    我正在尝试如上所述设置 CORShere https stackoverflow com questions 32167509 azure storage cors但有一个错误 azure storage cors set blob sta
  • DataGrid:帮助访问 CellEditingTemplate 中定义的控件

    我将 WPF DataGrid 与 DataGridTemplateColumn 一起使用 DataGridTemplateColumn CellEditingTemplate 包含一个 IsEditable 设置为 true 的 Comb
  • 如何在html中正确显示纵向模式的图像?

    我在我的网站上使用一些简单的照片 其中一些是横向模式 另一些是纵向模式 我使用最基本的 html img src doc 54836abcc1a36b7526daa146 当我访问该网址时 doc 54836abcc1a36b7526daa
  • 无法在 dockerfile 内执行 gcloud init

    我制作了一个 Dockerfile 用于将我的 node js 应用程序部署到 google 容器引擎中 它如下所示 FROM node 0 12 COPY google cloud sdk google cloud sdk RUN goo
  • 如何使用withColumn计算列中的最大值?

    我正在尝试计算 Spark 中以下 DataFrame 的最大值1 6 1 val df sc parallelize Seq 1 2 3 toDF id 第一种方法是选择最大值 它按预期工作 df select max id show 第
  • 库初始化——Win32 实现中的 pthread_once

    你好 我正在尝试为我的库创建一个完全线程安全的初始化函数 但我无法轻松找到 pthread once 的替代方案 这应该很容易解决问题 我已经看到这段代码 void libInit void ifdef WIN32 static volat
  • 在Python中将字符串从sha1哈希转换为base 64

    我有一个小的 C 函数 我想在 Python 中使用它 但是我不确定如何使用 hashlib 来完成相同的结果 该函数接收一个字符串并返回该字符串的 sha1 哈希值的 Base64 编码 private string ConvertStr
  • App Engine、事务和幂等性

    请帮我找出我的误解 我正在 App Engine 上编写 RPG 玩家采取的某些行动会消耗一定的统计数据 如果统计数据达到零 玩家就无法采取更多行动 不过 我开始担心欺骗玩家 如果玩家非常快地发送两个动作 并且彼此相邻怎么办 如果减少统计数
  • Opengl , GLSL 中的视差法线贴图问题

    我在视差法线贴图方面遇到了严重的问题 我不知道问题出在哪里 OpenGL 2 0 C WinXP My results 绿色是法线 蓝色是切线 红色是副法线 双切线 法线贴图工作正常 所以我认为切向量很好 奇怪的是 在一些立方体的墙上 视差
  • 与 Python 的 range 函数等效的 OCaml 习惯用法是什么?

    我想创建一个从 1 到 的整数列表n 我可以在 Python 中使用range 1 n 1 并在 Haskell 中使用 take n iterate 1 1 正确的 OCaml 习惯用法是什么 我不知道有什么习惯用法 但这里有一个使用中缀
  • java Hibernate 对分离对象的不必要查询

    我正在使用 hibernate 和 c3p0 连接池插入 更新和删除许多分离的对象 问题是 hibernate 不会批处理语句 而是执行 select session tx read only 在每个 session persist ins
  • ManageIQ 相对于 OpenStack Horizo​​n 有哪些优势?我目前正在 Horizo​​n 上工作,但想知道 ManageIQ 是否更好 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这两者有什么区别 我想从仪表板将资源控制到用户级别 只是想知道使用 ManageIQ 或 Horizo n 有哪些优势 什么是更好的选择 这取决
  • Python:如何获取消息框中的输入框?

    我刚刚意识到我在游戏开始时没有询问用户的名字 所以我尝试了这段代码 Label root text What is you name grid row 0 column 0 e1 self Entry root e1 self grid r
  • BluetoothSocket 未连接到目标设备

    我正在尝试通过蓝牙将我的设备连接到另一台设备 但是当我选择要连接的设备时 我得到一个IOException saying 读取失败 套接字可能关闭或超时 读取 ret 1 只是为了说明我的应用程序是如何工作的 我有一个RecyclerVie
  • 使用自定义分区器在 Pyspark 中对数据帧进行分区

    寻找有关在 Pyspark 中使用自定义分区程序的一些信息 我有一个数据框 保存各个国家 地区的国家 地区数据 因此 如果我对国家 地区列进行重新分区 它会将我的数据分配到 n 个分区 并将类似的国家 地区数据保留到特定分区 当我看到使用时
  • Google App Engine 上的 Python 2.7 无法使用 lxml.etree

    我一直在尝试在谷歌应用程序引擎的 python 2 7 上使用 html5lib 和 lxml 但是当我运行以下代码时 它给我一个错误 提示 NameError 全局名称 etree 未定义 是否无法在谷歌应用程序引擎上使用lxml etr
  • WiX 技巧和技巧

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我们使用 WiX 已有一段时间了 尽管人们常常抱怨其易用性 但它的运行情况相当不错 我正在寻找