【问题标题】:Wix Installer issues with version numbers and upgradesWix 安装程序版本号和升级问题
【发布时间】:2015-01-22 18:43:35
【问题描述】:

我正在尝试创建一个安装程序,该安装程序在每次构建解决方案时都会构建,并在解决方案构建输出文件夹中创建一个 MSI。安装仅用于安装 soution \bin 文件夹的组件。我们通过 Wintellect TFS 内部版本号任务使用 Major.Minor.Patch.Build 版本架构。

我希望能够在不卸载前一个的情况下安装每个 MSI。每次安装都将安装到其特定的 \bin_x.x.x.x 文件夹中,并使用应用程序 x.x.x.x 描述创建特定的桌面快捷方式和菜单项。它应该能够检测到您尝试安装的 MSI 是否已经安装,并提示修复或卸载。

          <?define ProductVersion=!(bind.FileVersion.$(var.MyProject.TargetFileName)) ?>
      <?define ProductName=MyProduct !(bind.FileVersion.$(var.MyProject.TargetFileName)) ?>
      <Product Id="*" Name="$(var.ProductName)"  Version="$(var.ProductVersion)"  UpgradeCode="$(var.NewUpgradeCode)">

  <MajorUpgrade AllowSameVersionUpgrades="yes" AllowDowngrades="no" MigrateFeatures="no" Schedule="afterInstallInitialize"  DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." />

在目录定义中,我使用 var.ProductVersion 来定义 \bin_x.x.x.x 文件夹

    <Directory Id="BINFOLDER" Name="bin_$(var.ProductVersion)"/>

在项目文件中我定义了 NewUpgradeCode

    <PropertyGroup>
  <NewUpgradeCode>$([System.Guid]::NewGuid())</NewUpgradeCode>
  <DefineConstants>NewUpgradeCode=$(NewUpgradeCode)</DefineConstants>
</PropertyGroup>

我在项目文件中使用 HeatDirectory 条目来获取输出 bin 文件夹中要安装的文件列表。

  <HeatDirectory OutputFile="BinFiles.wxs" Directory="..\Build\x64\Release\" ToolPath="$(WixToolPath)" PreprocessorVariable="var.MyProject.TargetDir" DirectoryRefId="BINFOLDER" ComponentGroupName="BinFolderComponents" GenerateGuidsNow="true" SuppressFragments="true" SuppressCom="true" SuppressRegistry="true" SuppressRootDirectory="true" KeepEmptyDirectories="true">

这一切都很好地解决了一些小问题。

  1. 当前的升级方案仍在删除以前安装的版本,无论版本号如何。我希望同时安装 1.0.0.1 和 1.0.0.2 版本。我在上面配置的方式似乎一直在卸载我安装的最后一个版本?

  2. 我想将 MSI 文件命名为 MyProject_x.x.x.x.MSI。但无论我采用什么方法来命名 MSI 文件,我总是得到 0 作为内部版本号。

即使 EXE 的版本类似于 1.2.0.321 它总是返回 1.2.0.0

但是 bind.FileVersion 确实提取了完整版的 EXE?但这仅在 Product.XML 中可用,而不在定义 MSI 文件名的 Project 文件中可用?

  1. 我想在运行 HeatDirectory 文件采集之前从输出文件夹中删除 Name_x.x.x.x.msi,以便不包含它。但由于我不知道以前的版本号,我需要在 BeforeBuild 过程中执行通配符删除 *.msi。如果我将删除作为 Pre-Build 事件进行,它不会删除文件,直到在 BeforeBuild 目标中运行 HeatDirectory 之后。

通配符删除在上述 XML 标记中不起作用。那么在运行 HeatDirectory 之前如何确保输出中没有 .MSI 文件?

【问题讨论】:

  • GetAssemblyIdentity 的奇怪行为没有意义。如果我将它指向一个已经构建的 EXE,它应该从中提取版本吗?但它似乎正在使用我当前的构建版本,它确实有一个 0 作为 4 位数。

标签: wix windows-installer


【解决方案1】:

我能够解决其中的一些问题。如果我删除 MajorUpgrade 升级行为就像我想要的那样工作。

解决了 BeforeBuild 中的删除文件问题

<Exec Command="del ..\Build\x64\Release\*.msi"/>

【讨论】:

  • @Flexo 我假设你是拒绝我旗帜的模组。在此帖子被标记时,答案的内容是See the EDIT and comments for my solutions. 我看不出这是一个答案。现在,您通过将问题中的“答案”编辑到这篇文章中来“解决”了问题;但是,问题本身提出了多个问题,因此它太宽泛了,并且您的编辑没有使问题成为主题。该问题目前有三票赞成,除非对该问题进行进一步编辑以使其成为主题,否则您的编辑是浪费时间。
  • @tinygiant 我什么都没做,或者你要求我做所需的 mod 权力。
  • @Flexo 所以我们现在不应该标记实际的非答案吗?很高兴知道。
猜你喜欢
  • 2012-02-04
  • 1970-01-01
  • 2012-09-06
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多