Основное обновление без удаления службы Windows
Мне действительно очень жаль, что я был лишним. Я проверил много других сообщений на этом сайте и, возможно, на некоторых других сайтах. Я не могу заставить работать Major Upgrade без удаления и переустановки сервиса. Я изменяю код и версию продукта, и UpgradeFileComponent является компонентом, который является частью обновления. Все остальные такие же, как в 1.0.0. Я делаю POC и, следовательно, хотел бы сделать только это небольшое изменение (не как патч, а как серьезное обновление). Ниже приводится мой Product.wxs. Я не включаю разметку для других вещей, таких как ServiceAccountDlg, Variables.wxi или en-us.wxl, так как это может сделать его очень длинным. Кто-нибудь может мне помочь, пожалуйста! Я уже пробовал WIX_UPGRADE_DETECTED, UPGRADINGPRODUCTCODE и т. Д., Но не смог заставить его работать. Каждый раз сервис удаляется и переустанавливается. Я проверяю это следующим образом. Как только служба запускается, она создает файл журнала в ProgramData и продолжает добавлять его каждые 5 секунд. Во время удаления MSI я удаляю этот файл журнала и его папку. После переустановки и перезапуска службы файл журнала снова создается. Благодаря этому я могу понять, что сервис постоянно переустанавливается при значительном обновлении. Я только хочу, чтобы новый файл был развернут без переустановки службы или удаления любого другого компонента. Я слышал от некоторых людей, что набор инструментов проверяет наличие измененных файлов и переустанавливает их, только если есть изменения. Но, похоже, это не так. Я попытался использовать атрибут Schedule с различными значениями, но безуспешно. Любая помощь будет действительно отличной. Я пытался это в течение многих дней без какой-либо удачи. Пожалуйста, дайте мне знать, если от меня потребуется дополнительная информация.
<?xml version="1.0" encoding="UTF-8"?>
<?include Variables.wxi ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util='http://schemas.microsoft.com/wix/UtilExtension'>
<Product Id="$(var.ProductCode)" Name="$(var.ProductName)" Language="!(loc.LANG)" Version="$(var.ProductVersion)" Manufacturer=" MyCompany" UpgradeCode="$(var.UpgradeCode)">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Id="*" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<!--<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion OnlyDetect="yes" Minimum="1.0.0" Maximum="2.0.0" IncludeMinimum="yes" IncludeMaximum="yes" Property="NEWERFOUND" />
</Upgrade>-->
<InstallExecuteSequence>
<!--<RemoveExistingProducts After="InstallExecute" />
<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>-->
<!--<InstallServices>NOT UPGRADINGPRODUCTCODE,NOT WIX_UPGRADE_DETECTED</InstallServices>-->
<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>
</InstallExecuteSequence>
<Condition Message='This application only runs on Windows 7 or higher OS versions.'>
<![CDATA[Installed OR (VersionNT64 >= 601)]]>
</Condition>
<MediaTemplate />
<Property Id="MSIFASTINSTALL" Value="1"/>
<Property Id="MsiLogging" Value="v" />
<Property Id="MSIENFORCEUPGRADECOMPONENTRULES" Value="1" />
<Property Id="INSTALLDIR">
<RegistrySearch Id='MyCompanyMSISampleRegistry' Type='raw' Root='HKLM' Key='SOFTWARE\MyCompany\CustomApp' Name='INSTALLDIR' Win64='yes' />
</Property>
<WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
<Feature Id='Complete' Title='Foobar 1.0' Description='The complete package.'
Display='expand' Level='1' ConfigurableDirectory='INSTALLDIR' AllowAdvertise='no' InstallDefault='local' Absent='disallow'>
<Feature Id="FileFeature" Title="File Feature" Level="1" AllowAdvertise='no' InstallDefault='local' Absent='disallow' Display='expand'>
<ComponentRef Id="FileComponent"/>
<ComponentRef Id="UpgradeFileComponent"/>
</Feature>
<Feature Id="ServiceFeature" Title="Service Feature" Level="1" AllowAdvertise='no' InstallDefault='local' Absent='disallow' Display='expand'>
<ComponentRef Id="ServiceComponent"/>
<ComponentRef Id="deleteFolder"/>
</Feature>
<Feature Id="RegistryFeature" Title="Registry Feature" Level="1" AllowAdvertise='no' InstallDefault='local' Absent='disallow' Display='expand'>
<ComponentRef Id="RegistryComponent"/>
</Feature>
<Feature Id='Documentation' Title='Description' Description='The instruction manual.' Level='2' AllowAdvertise='no' InstallDefault='followParent' Absent='disallow'>
<ComponentRef Id='Manual' />
</Feature>
</Feature>
<!--<UIRef Id="WixUI_Mondo"/>
<UIRef Id="WixUI_ErrorProgressText" />-->
<UI Id="MyWixUI_Mondo">
<UIRef Id="WixUI_Mondo" />
<DialogRef Id="ServiceAccountDlg" />
<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="ServiceAccountDlg" Order="2">LicenseAccepted = "1"</Publish>
<Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" Value="ServiceAccountDlg">1</Publish>
</UI>
<UIRef Id="WixUI_ErrorProgressText" />
<Icon Id="MyCompanyBanner.ico" SourceFile="Binary\MyCompanyBanner.ico" />
</Product>
<Fragment>
<Component Id='Manual' Guid='7470A2CD-B07C-4AB4-9152-8C6AA53FA0F7' Directory='INSTALLDIR'>
<File Id='Manual' Name='Manual.pdf' DiskId='1' Source='1.0.0\Manual.pdf' KeyPath='yes'>
<Shortcut Id="startmenuManual" Directory="DesktopFolder" Name="Instruction Manual" Advertise="yes" />
</File>
</Component>
</Fragment>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLDIR" Name="$(var.InstallFolderName)" />
</Directory>
<Directory Id="DesktopFolder" Name="Desktop" />
<Directory Id="CommonAppDataFolder">
<Directory Id="MyCompanyTestInstallerLogs" Name="MyCompanyTestInstallerLogs">
<Component Id="deleteFolder" Guid="323549D2-90B7-4D5D-8A36-EEA0ACCCC35E">
<RemoveFile Id="deleteServiceFile" Name="MyCompanyTestWinSvcLog.txt" On="both" Directory="MyCompanyTestInstallerLogs"/>
<RemoveFolder Directory="MyCompanyTestInstallerLogs" Id="MyCompanyTestInstallerLogs" On="both"/>
</Component>
</Directory>
</Directory>
</Directory>
</Fragment>
<Fragment>
<Component Id="FileComponent" Directory="INSTALLDIR" Guid="F143BE3C-48D6-4138-B4E6-5CF44773CBA5" >
<File Id="SampleTextFile.txt" Name="Sample.txt" Source="$(var.Version)\Sample.txt" KeyPath="yes">
<Shortcut Id="startmenuSampleText" Directory="DesktopFolder" Name="MyCompany MSI Sample" WorkingDirectory='INSTALLDIR' Icon='MyCompanyBanner.ico' Advertise='yes' />
</File>
</Component>
</Fragment>
<Fragment>
<Component Id="UpgradeFileComponent" Directory="INSTALLDIR" Guid="4582597C-2CE0-451E-8B89-83BA4ABCE464">
<File Id="SampleXMLFile.xml" Name="Sample.xml" Source="$(var.Version)\Sample.xml" KeyPath="yes" />
</Component>
</Fragment>
<Fragment>
<Component Id='ServiceComponent' Directory="INSTALLDIR" Guid="AEA0E53F-3D70-4010-8592-9A01FE49344D">
<util:User Domain="[DOMAIN]" Id="svcUser" Name="[USER_NAME]" Password="[PASSWORD]" LogonAsService="yes" CreateUser="no"/>
<File Id='MyCompanyTestWinSvc' Name='MyCompanyTestWinSvc.exe' Source='Binary\MyCompanyTestWinSvc.exe' KeyPath='yes' />
<ServiceInstall Id="installMyCompanyTestWinSvc" Name="MyCompanyTestWinSvc" DisplayName="MyCompany Install Test Windows Service" Start="auto" ErrorControl="normal" Type="ownProcess" Account="[DOMAIN]\[USER_NAME]" Password="[PASSWORD]" />
<ServiceControl Id="sc_MyCompanyTestWinSvc" Name="MyCompanyTestWinSvc" Start="install" Stop="both" Remove="uninstall" Wait="yes" />
<ServiceControl Id="stopAndStartIIS" Name="IISADMIN" Start="uninstall" Stop="install" Wait="yes" />
<ServiceControl Id="stopAndStartSQL" Name="MSSQLSERVER" Start="uninstall" Stop="install" Wait="yes" />
</Component>
</Fragment>
<Fragment>
<Component Id="RegistryComponent" Directory="INSTALLDIR" Guid="8D8D93A4-09F5-4511-B291-720A7BC70529">
<RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]' Type='string' Value='' KeyPath='yes' />
</Component>
</Fragment>
</Wix>
2 ответа
Ваш MajorUpgrade не указывает, где это запланировано. Как говорится в документации, по умолчанию используется значение "InstallValidate" и "Это планирование полностью удаляет установленный продукт перед установкой продукта обновления". Таким образом, основное обновление полностью удалит старый продукт, удалив службу, а затем установит обновление.
Поэтому вам следует начать с запланированного основного обновления после InstallExecute, потому что это будет вести себя как обновление поверх существующего установленного продукта, а подсчет ссылок должен минимизировать нарушение работы вашего сервиса. Это означает, что вы должны следовать правилам компонентов и увеличивать версии файлов версионных файлов, которые необходимо заменить.
Сказав это, обновление всегда является деинсталляцией более старого продукта, поэтому ServiceControl в этой более старой версии будет работать, и Remove="both" может быть проблемой, удаляя сервис во время обновления. Таким образом, оригинальный WiX ServiceControl имеет значение.
Кроме того, если не соблюдены правила для компонентов, обновление после InstallValidate будет работать нормально, поскольку оно удаляет все, а затем устанавливает новый продукт. Но если правила компонента не были соблюдены при обновлении после InstallExecute, возможно, компонент службы удаляется (из-за различий в идентификаторах компонентов), и вполне могут быть другие последствия несоблюдения правил.
И чтобы прояснить это, вам не нужно условие удаления служб в новой установке. Я бы начал с последовательности главного обновления в лучшем месте. Кроме того, UPGRADINGPRODUCTCODE как условие в вашем новом обновлении не имеет абсолютно никакого эффекта. Это свойство устанавливается в более старом продукте, если его удаляют при обновлении. Если вы хотите использовать это свойство, оно должно быть в исходном продукте, который уже установлен, поэтому, если он поставляется и установлен, уже слишком поздно изменять этот код (без исправления и т. Д.).
Более подробный журнал MSI показал бы более подробную информацию о том, что происходит и в каком порядке, указывайте строку как voicewarmup.
Я добавил это к моему <InstallExecuteSequence>
<!-- http://stackru.com/questions/15965539/how-to-only-stop-and-not-uninstall-windows-services-when-major-upgrade-in-wix don't change service config on upgrade -->
<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>
<InstallServices>NOT WIX_UPGRADE_DETECTED</InstallServices>
Кажется, работает для меня, но я больше не использую это из-за изменений в продукте. Вы должны быть уверены, что не будете изменять конфигурацию службы между версиями, поскольку при изменении конфигурации вам необходимо удалить и установить службы во время обновления.
Службы удаляются только при реальной деинсталляции (Роб [отвечающий на закомментированный вопрос] отмечает, что вам не нужно настраивать состояние "Удалить", поскольку в компонентах указано состояние установки / удаления служб)
И мы устанавливаем сервисы только при первой установке.