gpt4 book ai didi

WiX 主要升级 Windows 服务,保留 .config 并避免重新启动

转载 作者:行者123 更新时间:2023-12-04 02:12:27 25 4
gpt4 key购买 nike

我正在努力让 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>

相关但未答复:
  • Prevent service removal/install during WiX major upgrade - service not stopping

  • WiX 版本 3.8.1128.0

    最佳答案

    编辑 :似乎对同一问题或至少在同一主题上的这种解释可能更容易理解: Msiexec: automatic rollback to previous version on installation failure

    您在这里遇到了几个核心 MSI 使用问题。

  • 文件版本控制 :在安装期间,默认文件覆盖模式(由 REINSTALLMODE property 定义)不会替换默认情况下相同版本的文件。这可以通过设置 REINSTALLMODE = "emus"来改变。这将为版本化文件替换具有相同版本的文件。如果修改和创建日期不同,将保留未版本控制的文件。
  • 升级行为 :就像 Chris 所说,由于主要升级配置,看似恢复为默认值的文件实际上已被卸载并重新安装。如果 RemoveExistingProducts 放置在 InstallExecuteSequence 的后期,则仅在主要升级中才能保留文件。然后版本之间的共享文件永远不会被卸载,并且第 1 点中描述的文件版本控制规则适用于覆盖。
  • 服务配置保存 :避免重新输入服务凭据信息是在 InstallExecuteSequence 早期卸载的主要升级的常见问题。换句话说,产品被卸载,然后重新安装,删除更改的文件。我不推荐它,但有些人争论这个解决方案:How to only stop and not uninstall windows services when major upgrade in wix? ( Rob Mensching 是 WIX 和 Orca 的作者 - 我认为他建议将此解决方案作为一种选择,而不一定是推荐。请在链接的帖子中询问以确保)。通过正确的组件引用和卸载放置在 InstallExecuteSequence 的后期,这个问题通常可以完全避免,这是一种首选方法(正常的组件引用防止组件完全卸载,保留服务设置和更改的配置文件不变 - 当且仅当, 引用 的组件是正确的 - 请参阅下面对此概念的描述)。然而,我的首选方法 如果您使用用户帐户运行服务,仍然使用单独的 MSI 进行服务安装和配置 - 那么它是一个独立的部署单元,可以包含在 bootstrap 中并自行更新,最重要的是:它不受任何其他应用程序更改或修补程序的干扰。最后,我想指出,出于安全和部署原因,使用用户帐户运行的服务并不是推荐的开始方法。

  • 组件引用 :指的是分配给 MSI 组件的 GUID,以及它们必须如何在所有升级过程中始终匹配一个且只有一个(绝对)路径。在这里通过几个例子看到更好的讨论: Change my component GUID in wix?

    我没有提到将 MSI 组件安装服务设置为永久的选项,以防止它们在卸载时被删除,原因很简单,这根本不是一个好的做法。然后文件和注册将在最终卸载时保留,您需要一个自定义操作来清理。非常糟糕的做法,必然会导致大量额外的工作和悬空组件引用的问题。

    关于WiX 主要升级 Windows 服务,保留 .config 并避免重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23349685/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com