2016-05-11 2 views
1

Я хочу сохранить предыдущие версии моего приложения Bootstrapper, как этого добиться?WIX - Как выборочно удалить <Bundle>

Я знаю, что мы можем использовать тег Upgrade в MSI, где мы можем идентифицировать разные версии и выполнить операцию деинсталляции на них.

Теперь у меня есть приложение Bundle, которое имеет один или несколько MSI, которые используют некоторый код UpgradeCode. Каждый раз, когда я создаю новую сборку, я просто версия MSI и это приложение Bundle. Когда я приступаю к установке более поздней версии приложения Bundle, он удаляет предыдущую версию Bundle, чего я не хочу. Я хочу сохранить предыдущие версии приложения Bundle.

Есть ли что-то вроде UpgradeVersion в Bundle, где мы могли бы идентифицировать разные версии и выборочно удалять.

Мой Bundle код файла сниппет:

<Bundle Name="myApp" 
      Version="1.0.0.0" 
      Manufacturer="Myself" 
      UpgradeCode="SOME-GUID"> 

      <BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost" > 
      ... 
      </BootstrapperApplicationRef> 

    <Chain> 
     <PackageGroupRef Id= 'WindowsInstaller45'/> 
     <PackageGroupRef Id ='NetFx45Offline'/> 
     <PackageGroupRef Id ='MY_MSI'/> 
    </Chain> 
</Bundle> 

<Fragment Id ='PkgFragments'> 
<PackageGroup Id ="MY_MSI"> 
     <MsiPackage SourceFile= "$(var.Installer.TargetPath)" 
        Id="MYAPP" 
        Cache ="yes" 
        Visible ="no" 
        DisplayInternalUI ="no" 
        Permanent="no"> 
     <MsiProperty Name='INSTALLLOCATION' Value='[InstallFolder]' /> 
     <MsiProperty Name='SELECT_UNINST' Value='[UninstallPrevVersion]' /> 
     </MsiPackage> 
</PackageGroup> 
</Fragment> 

Мой Продукт код WIX файл фрагмент кода

<Product Id="*" 
      Name="$(var.ProductName)" 
      Version="$(var.ProductVersion)" 
      Manufacturer="$(var.ManufacturerName)" 
      UpgradeCode="$(var.UpgradeCode)"> 

    <Property Id="SELECT_UNINST" Secure="yes">1</Property> 

    <Upgrade Id="SOME-GUID2"> 
     <UpgradeVersion Minimum="0.0.0.0" Maximum="$(var.ProductVersion)" IncludeMinimum="yes" IncludeMaximum="yes" Property="UNINSTALL_PREV_VERSION" /> 
    </Upgrade> 

    <CustomAction Id="UninstPrev" Property="UNINSTALL_PREV_VERSION" Value="0" /> 

    <InstallExecuteSequence> 
     <Custom Action="UninstPrev" Before="InstallInitialize"><![CDATA[SELECT_UNINST <> 1]]></Custom> 
     <RemoveExistingProducts Overridable="no" After="UninstPrev"></RemoveExistingProducts> 
    </InstallExecuteSequence> 

</Product> 
+0

Желая, чтобы ваш продукт оставался во время ** обновления **, совершенно противоречит тому, что влечет за собой обновление. Если вы хотите, чтобы они остались позади, не рассматривайте их как один и тот же продукт, дайте им новые GUID обновления и GUID продукта. Сохраните список каждого руководства по обновлению, и если вы хотите его удалить, добавьте тег , ссылающийся на конкретный GUID обновления, который вы хотите удалить, и обработайте OnPlanRelatedBundle соответственно в вашей DLL BootstrapperApplication. –

ответ

1

Я положу это как ответ тоже.

Если вы не хотите удалять предыдущие версии, не рассматривайте новую версию как обновление до старого. Это означает изменение GUID обновления и изменение GUID продукта. Если вам нужно удалить определенную версию, добавьте пакет как <RelatedBundle> в определение вашего Bundle и правильно обработайте OnPlanRelatedBundle в своем приложении Bootstrapper.

<RelatedBundle Action="Detect" Id="$(var.ProductVersion622UpgradeGUID)"/> 

Кроме того, любой пакеты MSI установки также нужна будет использовать то же самое поведение нового обновления GUIDs, если вы не хотите, удаления между «модернизациями». Сохраните список идентификаторов GUID, с которыми выпущены версии. Если вы хотите, чтобы удалить определенные версии в выпуске вашего MSI вам нужно добавить

<Upgrade Id="$(var.Version6InstallerUpgradeGUID)" > 
    <UpgradeVersion 
     IncludeMaximum ="no" 
     IncludeMinimum="yes" 
     Maximum="6.0.0.1" 
     Minimum="6.0.0.0" 
     MigrateFeatures="no" 
     Property="V6FOUND" 
     OnlyDetect="no" />  
</Upgrade> 

Я хотел бы рассмотреть это требование очень странно и хотел бы предложить вам действительно думать о том, действительно ли вы хотите поддержать этот вид поведения ,

Также следует отметить, что запись в ARP для существующего загрузочного устройства необязательно означает, что продукты, которые он установил, все еще находятся в системе. Вы можете проверить это, всегда устанавливая pRequestedState = RequestState.Present; в OnPlanRelatedBundle и устанавливая свои пакеты msi в visible = "yes". У вас будет старый пакет, указанный в ARP, но пакеты, которые он устанавливает, вероятно, были обновлены более новой версией, поэтому это всего лишь запись, которая ничего не значит.

+0

Привет, Брайан, большое спасибо за ответ. Это правда, что это требование довольно странно. Фактически во время нашей установки мы спрашиваем пользователя, хочет ли он удалить некоторые из определенных предыдущих версий. Теперь, даже если я предоставил другой GUID для нового установщика, я не смогу выборочно помещать , соответствующий этим идентификаторам во время выполнения.MSI дайте мне этот вариант через , но я не могу видеть что-то подобное в Nitin

+0

Мой поток - это что-то вроде ..... У меня есть пользовательский интерфейс, который построен в WPF, набор, который пакеты WPF и фактический установщик Wix , Теперь в ARP должна быть запись Bundle, а не MSI (так как я хочу, чтобы мой пользовательский интерфейс отображался во время удаления). Который оставил меня только один вариант, я бы обновил свой Bundle. Итак, в конце, скажем, если у меня установлена ​​версия 1.0.0.0, то при установке 2.0.0.0 я спрошу пользователя, хочет ли он удалить 1.0.0.0. Если пользователь выбирает YES, тогда 2.0.0.0 должен идентифицировать предыдущую версию). – Nitin

+0

Не видя весь ваш продукт, я не понимаю, почему вы хотите оставить предыдущую версию. Если они не являются обновлениями продукта, не рассматривайте их как обновления и не используйте связанные пакеты. Обработайте DetectRelatedBundle и отобразите соответствующую информацию пользовательского интерфейса, а затем, исходя из выбора пользователя, обработайте событие OnPlanRelatedBundle, чтобы запросить удаление пакета или оставить его позади. Если MSI, содержащиеся в обоих пакетах, сами обновляются, даже если вы оставите старый пакет за отсутствием какого-либо фактического продукта, который он установил, на машине, так что в чем смысл его в ARP? –

Смежные вопросы