之前,文件没有被覆盖,因为AssemblyFileVersions是静态的,所以我修正了. 1)即使现在的文件修改日期与文件创建日期不同,它被设置为KeyPath,即使使用Schedule =“afterInstallExecute”,我的KeyPath =’yes’.config文件仍被覆盖.我目前不得不覆盖.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>
相关但未答复:
> Prevent service removal/install during WiX major upgrade – service not stopping
WiX版本3.8.1128.0
你在这里碰到几个核心的MSI使用问题.
>文件版本控制:在安装过程中,默认文件覆盖模式(由REINSTALLMODE property定义)将不会替换默认版本相同的文件.这可以通过设置REINSTALLMODE =“emus”来更改.这将替换版本文件的版本相同的文件.未修改的文件将被保留,如果修改和创建日期不同.
>升级行为:像Chris所说,由于主要的升级配置,似乎被恢复为默认的文件实际上被卸载并重新安装.如果RemoveExistingProducts放置在InstallExecuteSequence的后期,文件保存只能在主要升级中进行.然后,版本之间的共享文件将不会被卸载,并且第1点中描述的文件版本控制规则适用于覆盖.
>服务配置保护:避免重新进入服务凭证信息是早期在InstallExecuteSequence中卸载的主要升级的常见问题.换句话说,产品被卸载,然后重新安装擦除更改的文件.我不推荐它,但有些人认为这个解决方案:@L_403_4@(Rob Mensching是WIX和Orca作者 – 我认为他建议这个解决方案作为选择,而不一定是推荐,请在链接的帖子中确定).正确的组件引用和卸载安装在InstallExecuteSequence的后期,这个问题通常是完全避免的,这是一个首选的方法(正常的组件引用会阻止组件完全卸载服务设置并修改配置文件 – 如果只有,组件引用是正确的 – 参见下面这个概念的描述).但是,如果您正在使用用户帐户来运行服务,那么我首选的方法仍然是使用单独的MSI进行服务安装和配置,那么它是一个自包含的部署单元,可以包含在引导程序中并自行更新,最重要的是:它不受任何其他应用程序更改或修补程序的干扰.最后,我想指出,运行用户帐户的服务不是推荐的开始 – 为了安全和部署的原因.
组件引用:指的是分配给MSI组件的GUID以及它们必须匹配一个,并且在所有升级时始终只有一个(绝对)路径.看到更好的讨论,这里有几个例子:Change my component GUID in wix?
我没有提到将安装服务的MSI组件设置为永久性的选项,以防止在卸载时删除它们,原因很简单,这完全不是很好的做法.然后文件和注册将保持最终卸载,您需要自定义操作来清理.非常糟糕的做法,必然会造成大量额外的工作和悬挂组件引用的问题.