WiX: установщик исправлений, заменяющий предыдущие версии (1.0.0 -> 1.0.1, 1.0.0 -> 1.0.2, 1.0.1 -> 1.0.2, также.) - PullRequest
4 голосов
/ 06 марта 2012

Я пытаюсь предоставить простой установочный пакет (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 Ответ

1 голос
/ 20 марта 2012

У меня была похожая проблема, и я исправил ее, добавив соответствующую проверку в патч wxs.Попробуйте это ...

<Media Id="32000" Cabinet="HelloWorldRTM.cab">
  <PatchBaseline Id="HelloWorldRTM">
    <Validate ProductId="yes" UpgradeCode="yes" ProductVersion="Major" ProductVersionOperator="GreaterOrEqual" />
  </PatchBaseline>
</Media>

Если вы не хотите, чтобы исправление работало, когда установленный номер редакции больше номера редакции исправления, вы можете изменить ProductVersion на «Обновление» и установитьProductVersion для "GreaterOrEqual".

Я надеюсь, что он работает для вас!

...