我有一个非常简单的WiX项目(版本3.7),它安装了一些文件(.NET程序版本6.0.0.0).我准备使用WiX中的MajorUpgrade功能发布新版本6.0.1.0.
我在Product元素中保持UpgradeCode相同,并将Version从6.0.0.0更改为6.0.1.0
<Product Id="*" Name="MyApp" Version="6.0.1.0" Manufacturer="Me"
UpgradeCode="$(var.TheUpgradeCodeGUID)">
Run Code Online (Sandbox Code Playgroud)
在安装了6.0.0.0的计算机上,运行新安装程序.
删除旧版本6.0.0.0运行正常(所有已安装的文件都被删除),但是当安装程序继续安装新版本时,缺少2个文件:第三方DLL和第三方EXE(没有已被更改)未重新安装.
<Component Id="AutomaticUpdaterWPF.dll" Guid="*">
<File Id="AutomaticUpdaterWPF.dll" Source="AutomaticUpdaterWPF.dll" KeyPath="yes" Checksum="yes" />
</Component>
<Component Id="wyUpdaterProgram" Guid="*">
<File Id="wyUpdaterProgram" Source="wyUpdate.exe" KeyPath="yes" Checksum="yes" />
</Component>
Run Code Online (Sandbox Code Playgroud)
在主要升级期间,<ComponentGroup>中的所有其他文件(一些已修改,一些未修改,包括其他第三方DLL)正在正确安装.
如果我在主要升级后单击"修复",则会重新显示2个丢失的文件.此外,如果我是第一次安装版本6.0.1.0(没有升级,但在干净的机器上首次安装),则直接和正常安装这两个文件.(在几台Windows机器上测试过(XP,7和8)
任何人有什么建议错误以及如何解决?
我正在努力让MajorUpgrade,ServiceControl,.config文件很好地协同工作. 在我的另一个问题之后,我现在又有了相反的问题.
以前,文件没有被覆盖,因为AssemblyFileVersions是静态的所以我修复了它. 1)现在,即使Schedule="afterInstallExecute"
我的KeyPath='yes'
.config文件仍被覆盖,即使现有文件修改日期与文件创建日期不同,它也被设置为KeyPath.我目前不得不覆盖.config文件并在安装后重新启动服务.
2)即使我解决了这个问题,我仍然有一个避免重启的问题.如果我说Schedule="afterInstallInitialize"
那么我相信.config文件肯定会过早地与服务一起删除.如果我说Schedule="afterInstallExecute"
那么服务没有停止,安装后需要重新启动.(那是对的,对吗?)在安装之前手动停止服务让我避免重启.添加net stop
自定义操作可能会取代ServiceControl
我的想法,但是正确地获得所有条件似乎很复杂.
3)作为奖励,我想在升级期间根本不删除服务.我可以停止服务,替换二进制文件,然后再次启动服务吗?这将避免重新输入服务帐户凭据以进行升级.但是当然它仍然需要在首次安装时卸载并卸载功能.
这是它的主要内容(以后也捆绑在一起,以防万一在某种程度上很重要):
<MajorUpgrade DowngradeErrorMessage="A newer version is already installed."
Schedule="afterInstallExecute" />
<ComponentGroup Id="ServiceCG">
<Component Id="Service" Guid='*' Win64='yes' Directory='INSTALLDIR'>
<File Id='ServiceEXE' Source='$(var.root)Service.exe' />
<ServiceInstall Id="ServiceInstall"
Name="MyService"
DisplayName="My Server"
Type="ownProcess"
Start="auto"
ErrorControl="normal"
Description="My Server Service"
Interactive="no"
Account="[...]"
Password="[...]" />
<ServiceControl Id="StopService" Name="MyService" Start="install"
Stop="uninstall" Wait="yes" Remove="both" />
<util:User Id="UpdateServiceAccountLogonAsService" …
Run Code Online (Sandbox Code Playgroud) 我们正在尝试进行重大升级.在我调查的过程中,我找到了两种方法.
一个是使用升级ID,另一个是Majorupgrade标记.
似乎Majorupgrade很容易做到.但是,scheduleinitialize操作之前的计划不包含任何内容.
我不确定应该使用哪个.
主要是哪一个[和推荐]?
我的WiX安装程序(Wix 3.10,MSI 4.5)MajorUpgrade
用于更新.要heat.exe
预安装的文件将在预构建时收集.当前(较旧的)msi文件包含一个文件nlog.dll
(随NuGet包一起提供v4.1.0
),该文件的文件版本为4.1.0.0
,产品版本4.1.0
和上次写入时间为2015-09-01
.
由于nlog团队遇到了一些强烈的命名问题,他们发布了一个更新的NuGet包v4.1.1
,其中包含更新nlog.dll
后的文件版本减少回来,4.0.0.0
而其产品版本已增加到4.1.1
,最后写入时间为2015-09-14
.
现在我遇到了Robbie在这里遇到的一个相关问题:wix主要升级没有安装所有文件:当我安装新的msi软件包并执行主要升级时,现在nlog.dll
(根据其文件版本更新,但更旧)根据其文件日期和产品版本)正在删除,但新nlog.dll
安装没有.
但是,使用Schedule="afterInstallExecute"
或Schedule="afterInstallFinalize"
建议不会对我有用.不像在Robbie的情况下那样删除较新的文件而不安装较旧的文件,它不会覆盖当前文件,只是将其留在原位.
简而言之,我希望我的安装程序只需安装随附的所有文件,无论文件/产品/程序集版本是什么.在有效的情况下,需要用较旧的文件替换较新的文件.你不能告诉安装程序引擎忽略文件版本/日期吗?如果没有,我的选择是什么?
我们使用 WiX 来构建安装包。我是 WiX 技术的新手,目前正在尝试对已安装的应用程序进行重大升级,但目录位置与以前的版本不同。例如,如果产品的 v2 安装在 Program Files (x86)\Old_path\Product 上,我想将升级版本 v3 安装在不同的文件夹 C:\Program Files (x86)\New_path\Product 上。
我已修改 msi 属性 INSTALLDIR 以拥有新的位置路径。我们尝试更改InstallExecuteSequence,在InstallValidate之后添加RemoveRegistryValues以删除注册表上存储的旧路径,并执行WriteRegistryValues以添加新的注册表值。
<InstallExecuteSequence>
....
<Custom Action="HxPrepare" Before="InstallValidate">NOT Installed</Custom>
<RemoveRegistryValues After="InstallValidate" />
<WriteRegistryValues />
<Custom Action="HxFinalize" Before="StartServices">NOT Installed</Custom>
....
<InstallExecuteSequence />
Run Code Online (Sandbox Code Playgroud)
但我发现安装过程没有任何变化,新文件仅复制到旧目录路径。即使修改了 INSTALLDIR 路径后,我还能知道这个旧路径是从哪里获得的吗?我们如何在重大升级期间更改安装路径。
回复 PhilDW 的评论:
这是重大升级的正确过程。所有旧版本文件都将被删除。但是,在我们的应用程序中,升级期间没有浏览对话框来询问新的/所需的安装目录。它只需要以前版本的路径。这是因为首先我们需要备份较低版本的重要设置/用户配置文件,然后在升级版本中使用它们。保存此备份后,我尝试将此备份文件移动到新路径,然后开始复制新文件。我在 HxPrepare 步骤中将路径更改为 INSTALLDIR,并希望在新目录中继续该过程。但我不知道从哪里才考虑旧路。
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize" />
<Custom Action="PreventDowngrade" After="FindRelatedProducts">DOWNGRADE</Custom>
<Custom Action="HxInit" After="CostFinalize">NOT Installed</Custom>
<Custom Action="HxPrepare" Before="InstallValidate">NOT Installed</Custom>
<Custom Action="HxFinalize" Before="StartServices">NOT Installed</Custom>
<Custom Action="HxPreUninstall" Before="InstallValidate">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
<Custom Action="HxUninstall" After="InstallInitialize">(NOT UPGRADINGPRODUCTCODE) AND …
Run Code Online (Sandbox Code Playgroud) 我正在安装软件的所有新版本作为主要升级,因为安装非常小,而且大多数情况下,所有文件都会更改。
如果完成了与全新安装相比的升级,我想跳过安装程序中的一个对话框,但是到目前为止,在以下示例中,我仍无法弄清要使用什么条件(例如“ Installed AND PATCH”)。
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog"
Value="WelcomeDlg" Order="2">Installed AND PATCH</Publish>
Run Code Online (Sandbox Code Playgroud) WiX 安装程序产品节点有一个属性UpgradeCode。它用于指代同一产品的先前版本。该值存储在UpgradeTable中。UpgradeTable 由FindRelatedProducts操作进行解析。
允许UpgradeCode
删除具有相同的以前的产品UpgradeCode
。但计划是将几个过时的遗留产品集成到一个组合的单一产品中。UpgradeCode
该遗留产品的特征是已知的。我希望将此代码添加到 UpgardeTable 中也能删除此遗留产品。这可以通过填充 UpgradeTable 来完成。
如何在 WiX 设置的升级表中添加更多条目?
编辑:需要什么语法?
有没有更好的方法来删除升级后废弃的产品?
我有一个 WiX 设置,其中有
<MajorUpgrade Schedule="afterInstallInitialize"
DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." />
Run Code Online (Sandbox Code Playgroud)
如果升级过程中发生错误,安装程序将回滚并恢复以前安装的版本。但是,通过自定义操作创建的计划任务会丢失并且永远不会恢复。
我用于创建/删除/回滚任务的自定义操作是:
<!-- task scheduling -->
<CustomAction Id="CreateScheduledTask" Return="check" Directory="SystemFolder"
ExeCommand=""[SystemFolder]SCHTASKS.EXE" /Create /RU "[TASK_DOMAIN]\[TASK_USERNAME]" /RP [TASK_PASSWORD] /SC DAILY /TN "Maintenance" /TR "[\\]"[SERVICELOCATION]Maintenance.exe[\\]"" /ST [TASK_TIME]"
Execute= "deferred"/>
<!-- rollback in case something went wrong -->
<CustomAction Id="CreateScheduledTask_Rollback" Execute="rollback" Return="ignore" Directory="SystemFolder" ExeCommand=""[SystemFolder]SCHTASKS.EXE" /Delete /TN "Maintenance" /F" />
<!-- removal of task -->
<CustomAction Id="RemoveScheduledTask" Return="ignore" Directory="SystemFolder" ExeCommand=""[SystemFolder]SCHTASKS.EXE" /Delete /TN "Maintenance" /F" Execute= "immediate"/>
Run Code Online (Sandbox Code Playgroud)
其排队为 …
我们有一个安装程序,需要在安装时重新启动,但在卸载时也会重新启动。有什么方法可以防止卸载时重新启动吗?
这是我们目前所拥有的:
<InstallExecuteSequence>
<ScheduleReboot After="InstallFinalize"/>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
提前谢谢了!