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