使用Wix的技巧和提示有哪些?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (78)

我想知道在以下方面使用Wix的有效建议:

  • 设置Wix项目(布局、引用、文件模式)
  • 将Wix集成到解决方案中,并构建/发布过程
  • 为新安装和升级配置安装程序
  • 以及你想要分享的关于Wix的优点
提问于
用户回答回答于

使用相同的源文件创建 Live, Test, Training等版本。

为每个安装程序创建唯一的UpgradeCode,并自动为每个安装程序定义每个Guid的第一个字符,留下剩下的31个惟一字符。

前提条件

假设

  • Wix变量用于定义UpgradeCode、ProductName、InstallName。
  • 安装程序正常工作
  • 所有组件都保存在一个文件中(Components.wxs)。如果你有多个文件,这个过程将会起作用,并且会有更多的工作要做。

目录结构

  • Setup.Library
    • 所有wxs文件(组件、特性、UI对话框)
    • Common.Config.wxi(ProductCode=“*“,ProductVersion,PlatformProgramFilesFold,...)
  • Setup.Live (wixproj)
    • 使用“添加现有文件” - >“添加为链接”(Visual Studio中添加按钮旁边的向下箭头按钮)链接所有Setup.Library文件
    • Config.wxi(有唯一的UpgradeCode,ProductName,InstallName,...)
  • Setup.Test
    • Config.wxi是为Test环境配置的。

过程

  • 创建.Setup.Library目录,并将所有wxs和wxi文件(Config.wxi除外)从现有项目中移出。
  • 按照正常的wixproj.测试环境创建Setup.Live, Setup.Test等程序
  • 在安装过程中,在wixproj中添加BeforeBuild目标,.Live来执行MSBuild社区任务,FileUpdate来修改Guids(我使用了Live, B用于测试,C用于练习)
  • 添加AfterBuild目标,将Components.wxsGuids还原回0。
  • 使用Orca验证每个MSI中的每个组件都有修改的GUID。
  • 验证原始GUID是否已恢复。
  • 确认每个MSI安装(并升级)正确的产品和位置。

Config.Common.wxi

<?xml version="1.0" encoding="utf-8"?>
<Include>
<!-- Upgrade code should not change unless you want to install 
     a new product and have the old product remain installed, 
     that is, both products existing as separate instances. -->
<?define UpgradeCode = "YOUR-GUID-HERE" ?>

<!-- Platform specific variables -->
<?if $(var.Platform) = x64 ?>
  <!-- Product name as you want it to appear in Add/Remove Programs-->
  <?define ProductName = "Foo 64 Bit [Live]" ?>
<?else ?>
  <?define ProductName =  "Foo [Live]" ?>
<?endif ?>

<!-- Directory name used as default installation location -->
<?define InstallName = "Foo [Live]" ?>

<!-- Registry key name used to store installation location -->
<?define InstallNameKey = "FooLive" ?>

<?define VDirName = "FooLive" ?>
<?define AppPoolName = "FooLiveAppPool" ?>
<?define DbName = "BlahBlahLive" ?>
</Include>

Config.Common.wxi

<?xml version="1.0" encoding="utf-8"?>
<Include>
<!-- Auto-generate ProductCode for each build, release and upgrade -->
<?define ProductCode = "*" ?>

<!-- Note that 4th version (Revision) is ignored by Windows Installer -->
<?define ProductVersion = "1.0.0.0" ?>

<!-- Minimum version supported if product already installed and this is an upgrade -->
<!-- Note that 4th version (Revision) is ignored by Windows Installer -->
<?define MinimumUpgradeVersion = "0.0.0.0" ?>

<!-- Platform specific variables -->
<?if $(var.Platform) = x64 ?>
   <?define Win64 = "yes" ?>
   <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
<?else ?>
   <?define Win64 = "no" ?>
   <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
<?endif ?>

<?define ProductManufacturer = "Foo Technologies"?>

<!-- Decimal Language ID (LCID) for the Product. Used for localization. -->
<?define ProductLanguage = "1033" ?>

<?define WebSiteName = "DefaultWebSite" ?>
<?define WebSitePort = "80" ?>

<?define DbServer = "(local)" ?>
</Include>

Components.wxs

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <!-- The pre-processor variable which allows the magic to happen :) -->
  <?include $(sys.CURRENTDIR)\Config.wxi?>
  <?include ..\Setup.Library\Config.Common.wxi?>
  <Fragment Id="ComponentsFragment">
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="$(var.PlatformProgramFilesFolder)">
        <Directory Id="INSTALLLOCATION" Name="$(var.InstallName)">
          <Component Id="ProductComponent" Guid="0XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" KeyPath="yes">
          ...

注意:我现在建议将Guid属性排除在组件之外(相当于*),每个组件使用一个文件,并将文件设置为keypath。这消除了调用ModifyComponentsGuids和RevertComponentsGuids目标的需要。但是,对于所有的组件,这应该是不可能的。

Setup.Live.wixproj

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
  <CallTarget Targets="ModifyComponentsGuids" />
</Target>
<Target Name="AfterBuild">
  <CallTarget Targets="RevertComponentsGuids" />
</Target>
<!-- Modify the first character of every Guid to create unique value for Live, Test and Training builds -->
<Target Name="ModifyComponentsGuids">
  <FileUpdate Files="..\Setup.Library\Components.wxs" Regex="Guid=&quot;([a-f]|[A-F]|\d)" ReplacementText="Guid=&quot;A" />
</Target>
<!-- Revert the first character of every Guid back to initial value -->
<Target Name="RevertComponentsGuids">
  <FileUpdate Files="..\Setup.Library\Components.wxs" Regex="Guid=&quot;([a-f]|[A-F]|\d)" ReplacementText="Guid=&quot;0" />
</Target>

最后

  • 这个过程还应该为不同的合并模块创建不同的安装程序(Live, Test作为特性)对于相同的安装程序。我使用了不同的安装程序,因为它会更安全,如果他们在同一个盒子上,而你只是使用不同的合并模块的特性,那么可能会有人升级Live。
  • 如果你使用MSI来执行升级和新安装程序,即主要升级方法,并且将安装位置保存在注册表中,请记住为每个安装创建一个变量名。
  • 我们还在每个Config.wxi中创建变量,为每个安装程序启用唯一的虚拟目录名称、应用程序池、数据库名称等等。

更新1:如果你为每个文件创建带有Guid="*"的组件,则自动生成组件Guids将消除调用FileUpdate任务的需要,将文件设置为keypath。

更新2:我们遇到的问题之一是,如果您不自动生成组件Guid而构建失败,那么需要手动删除临时文件。

更新3:找到了一种消除对SVN依赖的方法:外部和临时文件创建。这使得构建过程更有弹性(如果不能通配你的Guids,则是最好的选择)。

更新4:在Wix 3.0+中,支持更多使用实例

热门问答

域名注册时写了企业,可以转为个人的吗?

滑稽园扛把子

Swoole · PHP开发工程师 (已认证)

As a PHP Developer
推荐
可以的,操作如下 登录控制台 登录 腾讯云控制台。 选择 “云产品 > 域名与网站 > 域名注册”,进入 “域名服务” 页面,查看已购买的所有域名信息。 修改/过户域名信息 在需要修改域名信息的域名行中,单击【更多】,选择【域名信息修改】。如下图所示: 也可直接单击需要修改域名信...... 展开详请

如何按照上传时间顺序,获取cos bucket 中的object信息?

波斯狗儿对象存储产品经理
推荐
对象存储是 KV 有序存储,只能按对象键 UTF-8 字符顺序排。详细了解对象的概念:https://cloud.tencent.com/document/product/436/13324 如果需要按时间列表,需要在上传时就指定好路径,这样列表的时候也是按顺序的。比如 pho...... 展开详请

云开发环境和开发者自己的服务器能连通吗?

李成熙heyli

腾讯 · 高级工程师 (已认证)

腾讯高级工程师,专注于工程化及性能优化。 https://github.com/lcxfs1991
可以的请参考这份教程: https://github.com/TencentCloudBase/mp-book/blob/master/guide/readme.md#3-%E5%9C%A8%E8%87%AA%E5%B7%B1%E7%9A%84%E6%9C%8D%E5%8A%A1...... 展开详请

腾讯云 COS 怎么才能外链调用 m3u8 到别的网站播放?

滑稽园扛把子

Swoole · PHP开发工程师 (已认证)

As a PHP Developer
推荐
设置公有读私有写:当访问对象时,COS 读取到对象的权限为公有读,此时无论存储桶为何种权限,对象都可以被直接下载 设置步骤 登录 对象存储控制台,选择左侧菜单栏【存储桶列表】,进入存储桶列表页面。单击需要修改对象权限的对应存储桶,进入存储桶。 📷 找到需要设置权限的对象(如 e...... 展开详请

云通信IM 可以发送语音消息吗?

应兆康腾讯云+校园合伙人
可以的哦,在云通信IM的文档中有写 消息类型(文本,图片,语音,表情等自定义消息): 文本:最大 1~2k 字节(支持透传特殊字符); 图片:原图/缩略图/大图(支持格式:png/gif/jpeg/jpg/webp); 语音:异步语音消息(语音支持暂无上限); 表情等自定义消息...... 展开详请

Ubuntu搭建的WordPress如何修改php.ini?

滑稽园扛把子

Swoole · PHP开发工程师 (已认证)

As a PHP Developer
推荐
php新手很多不知道怎么查配置文件在哪,这里提供一个很简单的方法 使用 php -i 命令可以打印php的详细信息,可以把这堆东西输出一下 php -i > outputphp.txt,结合 grep 查找命令 php -i| grep php.ini 打印结果如下 Config...... 展开详请

所属标签

扫码关注云+社区