【发布时间】:2014-06-14 12:10:01
【问题描述】:
我正在努力让 MajorUpgrade、ServiceControl、.config 文件很好地协同工作。 After my other question,我现在又遇到了相反的问题。
之前,文件没有被覆盖,因为 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" UpdateIfExists="yes"
CreateUser="no" Name="[SERVICEACCOUNTFULL]"
LogonAsService="yes"/>
</Component>
<Component Id="ServiceConfig" Guid='*' Win64='yes' Directory='INSTALLDIR'>
<File Id='FileServiceConfig' KeyPath='yes'
Source='$(var.root)Service.exe.config' />
</Component>
</ComponentGroup>
相关但未回答:
WiX 版本 3.8.1128.0
【问题讨论】:
-
您使用的是哪个版本的 wix?知道这可能会帮助您获得有用的答案。
-
WiX 版本 3.8.1128.0
-
WiX 版本与这个问题并不真正相关。所有涉及的元素都映射到 Windows Installer 表,并且没有额外的自定义扩展。重要的是底层 MSI 行为。
标签: wix installation windows-installer major-upgrade