Wix Installer会出现版本号和升级问题

时间:2015-01-22 18:43:35

标签: wix windows-installer

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

我希望能够在不卸载前一个MSI的情况下安装每个MSI。每个安装都将安装到其特定的\ bin_x.x.x.x文件夹中,并使用app 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为Build编号。

           

  3. 即使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之前,它不会删除文件。

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

1 个答案:

答案 0 :(得分:0)

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

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

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