1

我正在使用 WIX 为我的应用程序创建一个 Windows 安装程序,因此,我以通常的方式开始:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
    <Product Id="*" Name="Project X" Manufacturer="X LLC" Language="1033"
             Version="1.0.0.1" UpgradeCode="PUT-GUID-HERE>
        <Package InstallerVersion="301" Compressed="yes" InstallScope="perMachine"/>

        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed."/>

因为Id设置为*,所以每次我构建 MSI 时它都有不同的 id,但UpgradeCode保持不变。当版本有升级时(例如1.0.0.2),这成功地实现了用新的替换旧的。

MajorUpgrade条目会阻止安装较低版本,例如 1.0.0.0。

如果我运行完全相同的 MSI 文件,它会显示一个对话框来修复、卸载或更改安装参数。

我的问题是,如果我重新构建 MSI 并运行新的 MSI,它会像没有安装其他 Project X 副本一样安装,并且用户最终会在 Windows 应用程序和功能中获得两个条目。

有没有办法防止这种情况?有没有办法在每次构建时不必修改(和提交)我的.wxs文件或另一个构建文件来防止它?我试图让我的构建尽可能自动化,并且每次都必须打开一个文件进行更改,这真的很烦人。

关于将版本号传递给candle.exe,它并不能解决问题。这仍然需要将版本号存储在 repo 中,为安装程序的每个测试创建提交。无论我必须在wxs文件中手动写入数字还是必须在pom.xml(这是构建工具的配置)中手动写入数字,或者它是否在构建过程中生成并存储在文件中然后我必须提交到文件中,这都是同样的问题回购,以便我和所有参与的开发人员的数量保持单调增加。

万一这很重要,我使用 Git 作为我的源代码控制系统,使用 Maven 作为我的构建工具,heat.exe调用. 具体来说,我没有使用 Visual Studio。candle.exelight.exe

关于类似的问题WIX。相同版本不同产品代码如何进行重大升级?,问题和答案都假定.wxs每次构建安装程序进行测试时都可以修改文件以增加版本号。我不认为这是可以接受的。我已经知道这是可能的,因为这就是MajorUpgrade我在这个问题中注意到的。

4

3 回答 3

0

我很着急,我没有时间详细阅读您的问题。但是,略读一下,我想我不久前也处理过类似的事情,因此我决定尝试 WiX 中的旧式主要升级元素,以更好地控制升级表的最终填充方式。主要升级是一项便利功能,使用旧式元素可以更精细地控制升级表。

我不确定这是否是您所追求的,但让我尝试链接到我所指的答案:Doing Major Upgrade in Wix 在 Add/Remove Programs 中创建 2 个条目。我记得,我对其进行了更改,因此运行具有不同产品代码的相同版本 MSI 会触发“ downgrade not allowed-message ”,从而阻止新版本安装在现有版本之上。然后,您可以手动从添加/删除程序中卸载旧版本,或右键单击旧 MSI 并选择删除。右键单击新的 MSI 并删除将不起作用 - 因为此 MSI 具有新的产品代码,并且无法以这种方式卸载以前的版本。

于 2018-04-24T02:01:40.490 回答
-1

在构建系统中生成版本号并传递给candle.exe命令行:

candle.exe -dProductVersion=<value>

然后引用预处理器变量:

<Product Version="$(var.ProductVersion)" ...

请注意,只有产品版本中的第一个字段限制为 255。第三个(如果您使用它,第四个)最多可以达到 65535。

于 2018-04-23T21:01:54.280 回答
-1

这是因为您的 ProductCode GUID 是在每次构建时随机生成的,但您的 ProductVersion 并未增加。您需要遵循格式 0-255,0-255,0-255(每个规范允许忽略第四个)并在每次构建时增加它。然后每个 MSI 将执行一次重大升级,从而产生一个条目。

这台机器现在状态不好,所以清理它可能很有趣。我会先卸载所有旧实例,然后再继续。

于 2018-04-23T19:37:16.150 回答