WiX: установщик исправлений, заменяющий предыдущие версии (1.0.0 -> 1.0.1, 1.0.0 -> 1.0.2, 1.0.1 -> 1.0.2, также.)
Я пытаюсь предоставить простой установочный пакет (MSI), который я хочу поддерживать с помощью обновлений (исправлений), которые заменяют все предыдущие исправления. Так что у меня есть MSI V1.0.0 и 2 патча V1.0.1 и V1.0.2. Пользователь должен иметь возможность просто установить последнее исправление независимо от того, какие предыдущие исправления уже были применены к системе. Мой проект содержит 2 функции (клиент и сервер). Основой патча всегда является пакет RTM (HelloWorld 1.0.msi / HelloWorld 1.0.wixpdb).
Генерация (сборка) всех патчей работает, так что процедуры обновления 1.0.0 -> 1.0.1 и 1.0.0 -> 1.0.2 делают, НО, когда я пытаюсь обновить с 1.0.1 до 1.0.2, патч не работает со следующим сообщением об ошибке: "Исправление обновления не может быть установлено службой установщика Windows, так как может отсутствовать обновляемая программа, или исправление обновления может обновить другую версию программы. Убедитесь, что обновляемая программа существует на ваш компьютер и что у вас есть правильный патч для обновления. " Еще хуже, когда я запускаю патч 1.0.1 в системе, где 1.0.2 уже установлена, патч перезаписывает существующую установку более старой версией!? Я полностью сбит с толку...
Я также нашел в блоге несколько записей о исправлениях, но ничего, что не работает с моим заменой сценария.
код исправления wix - "patch1.wxs":
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Patch
AllowRemoval="yes"
Manufacturer="My Company"
MoreInfoURL="http://www.mycompany.com/"
DisplayName="HelloWorld V1.0 Patch 1"
Description="Patch intaller updating HelloWorld V1.0.x to V1.0.1"
Classification="Update">
<Media Id="32000" Cabinet="HelloWorldRTM.cab">
<PatchBaseline Id="HelloWorldRTM">
<Validate ProductId="yes" UpgradeCode="yes" ProductVersionOperator="LesserOrEqual" />
</PatchBaseline>
</Media>
<PatchFamilyRef Id="HelloWorldPatchFamily"/>
</Patch>
<Fragment>
<PatchFamily Id='HelloWorldPatchFamily' Version='1.0.1.0' Supersede='yes'>
<PropertyRef Id="ProductVersion"/>
<ComponentRef Id="HelloWorldServer.dll"/>
</PatchFamily>
</Fragment>
</Wix>
скрипт сборки патча 1 - "generate_patch1.bat":
"%WIX%\bin\torch.exe" -p -xi ".\_Distrb\HelloWorld 1.0.wixpdb" ".\_Distrb\HelloWorld 1.0.1.wixpdb" -out ".\_Build\patch1.wixmst"
"%WIX%\bin\candle.exe" -out ".\_Build\patch1.wixobj" ".\patch1.wxs"
"%WIX%\bin\light.exe" ".\_Build\patch1.wixobj" -out ".\_Build\patch1.wixmsp"
"%WIX%\bin\pyro.exe" ".\_Build\patch1.wixmsp" -out ".\_Distrb\HelloWorld 1.0 Patch1.msp" -t HelloWorldRTM ".\_Build\patch1.wixmst"
код исправления wix - "patch2.wxs":
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Patch
AllowRemoval="yes"
Manufacturer="My Company"
MoreInfoURL="http://www.mycompany.com/"
DisplayName="HelloWorld V1.0 Patch 2"
Description="Patch intaller updating HelloWorld V1.0.x to V1.0.2"
Classification="Update">
<Media Id="32000" Cabinet="HelloWorldRTM.cab">
<PatchBaseline Id="HelloWorldRTM">
<Validate ProductId="yes" UpgradeCode="yes" ProductVersionOperator="LesserOrEqual" />
</PatchBaseline>
</Media>
<PatchFamilyRef Id="HelloWorldPatchFamily"/>
</Patch>
<Fragment>
<PatchFamily Id='HelloWorldPatchFamily' Version='1.0.2.0' Supersede='yes'>
<PropertyRef Id="ProductVersion"/>
<ComponentRef Id="HelloWorldServer.dll"/>
<ComponentRef Id="HelloWorld.exe"/>
</PatchFamily>
</Fragment>
</Wix>
скрипт сборки патча 2 - "generate_patch2.bat":
"%WIX%\bin\torch.exe" -p -xi ".\_Distrb\HelloWorld 1.0.wixpdb" ".\_Distrb\HelloWorld 1.0.2.wixpdb" -out ".\_Build\patch2.wixmst"
"%WIX%\bin\candle.exe" -out ".\_Build\patch2.wixobj" ".\patch2.wxs"
"%WIX%\bin\light.exe" ".\_Build\patch2.wixobj" -out ".\_Build\patch2.wixmsp"
"%WIX%\bin\pyro.exe" ".\_Build\patch2.wixmsp" -out ".\_Distrb\HelloWorld 1.0 Patch 2.msp" -t HelloWorldRTM ".\_Build\patch2.wixmst"
1 ответ
У меня была похожая проблема, и я исправил ее, добавив соответствующую проверку в патч wxs. Попробуй это...
<Media Id="32000" Cabinet="HelloWorldRTM.cab">
<PatchBaseline Id="HelloWorldRTM">
<Validate ProductId="yes" UpgradeCode="yes" ProductVersion="Major" ProductVersionOperator="GreaterOrEqual" />
</PatchBaseline>
</Media>
Если вы не хотите, чтобы исправление работало, когда установленный номер редакции превышает номер редакции исправления, вы можете изменить ProductVersion на "Обновление" и установить ProductVersion на "GreaterOrEqual".
Я надеюсь, что это работает для вас!