2010-02-15 13 views
15

Tengo dificultades para habilitar la principal funcionalidad de actualización en WiX.¿Cómo funciona la actualización principal de WiX?

Quiero que cada versión nueva del instalador sea una actualización importante (desinstalación completa, luego nueva instalación) ya que no queremos una actualización diferente y versiones de instalación limpias.

Empecé tratando de hacerlo usando las etiquetas, pero seguí recibiendo "Se ha instalado otra versión". mensaje de error cuando ejecuto el instalador.

Así que implementé la nueva etiqueta que se agregó en V3.5 para facilitar las actualizaciones. Todavía recibía el mensaje de error.

Luego leí en alguna parte que necesita cambiar el GUID de Id para cada nueva versión. Así que configuré Id = "*" para que WiX los genere.

Ahora, cuando instalo la versión más nueva, no desinstala la versión anterior y termina con dos instalaciones en la misma carpeta. Lo resolví porque ejecutar MSI (nuevo o viejo) abriría la pantalla reparar/eliminar.

Además, el programa no se sobrescribió con la nueva versión.

Aquí es el comienzo de mi guión WiX:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 

    <Product Id="*" 
      Name="Foo" 
      Language="1033" 
      Codepage="1252" 
      Version="!(bind.FileVersion.Foo.exe)" 
      Manufacturer="Foo Bar Ltd." 
      UpgradeCode="dac2fab2-7d76-4e47-b25f-0748380dab81"> 

     <Package 
       Description="Foo" 
       Comments="This installer database contains the logic and data required to install Foo." 
       InstallerVersion="300" 
       Languages="1033" 
       SummaryCodepage="1252" 
       Platform="x86" 
       Compressed="yes" /> 

     <!-- Remove older versions --> 
     <!-- Important note: MSI ignores the last version digit 1.0.0.? when comparing versions, so always change at least the 3rd digit for new external releases--> 
     <MajorUpgrade DowngradeErrorMessage="The version currently installed is newer than the version you are attempting to install."/> 

Respuesta

20

He aquí un fragmento de lo que utilizo para todos mis paquetes, refinado durante muchos comunicados internos y públicos

<Product Id="*" 
     UpgradeCode="$(var.Property_UpgradeCode)" 
     Name="!(loc.ApplicationName)" 
     Language="!(loc.Property_ProductLanguage)" 
     Version="$(var.version)" 
     Manufacturer="!(loc.ManufacturerName)" > 

    <Package Description="!(loc.Package_Description) $(var.version)" 
      Comments="!(loc.Package_Comments)" 
      Manufacturer="!(loc.ManufacturerName)" 
      InstallerVersion="301" 
      Compressed="yes" 
      InstallPrivileges="elevated" 
      InstallScope="perMachine" 
      Platform="$(var.ProcessorArchitecture)" /> 

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" /> 

    <Upgrade Id="$(var.Property_UpgradeCode)"> 
     <UpgradeVersion OnlyDetect="yes" 
         Minimum="$(var.version)" 
         Property="NEWERVERSIONDETECTED" 
         IncludeMinimum="no" /> 

     <UpgradeVersion OnlyDetect="no" 
         Maximum="$(var.version)" 
         Property="OLDERVERSIONBEINGUPGRADED" 
         IncludeMaximum="no" /> 

     <!-- Detect for changes in 4th field only --> 
     <UpgradeVersion Property="ANOTHERBUILDINSTALLED" 
       Maximum="$(var.version)" Minimum="$(var.version)" 
       IncludeMinimum="yes" IncludeMaximum="yes" OnlyDetect="yes" /> 

    </Upgrade> 

    <CustomAction Id="CA_BlockOlderVersionInstall" Error="!(loc.LaunchCondition_LaterVersion)" /> 
    <CustomAction Id="CA_BlockAnotherBuildInstall" Error="!(loc.LaunchCondition_AnotherBuild)" /> 

    <InstallExecuteSequence> 
     <Custom Action="CA_BlockOlderVersionInstall" After="FindRelatedProducts"> 
      <![CDATA[NEWERVERSIONDETECTED]]> 
     </Custom> 

     <!-- Prevent installation on 4th version field change only --> 
     <Custom Action="CA_BlockAnotherBuildInstall" After="FindRelatedProducts"> 
      <![CDATA[ANOTHERBUILDINSTALLED]]> 
     </Custom> 

     <LaunchConditions After="AppSearch" /> 

     <!-- Schedule RemoveExistingProducts early --> 
     <RemoveExistingProducts After="InstallInitialize" /> 
    </InstallExecuteSequence> 

    <InstallUISequence> 
     <Custom Action="CA_BlockOlderVersionInstall" After="FindRelatedProducts"> 
      <![CDATA[NEWERVERSIONDETECTED]]> 
     </Custom> 

     <!-- Prevent installation on 4th version field change only --> 
     <Custom Action="CA_BlockAnotherBuildInstall" After="FindRelatedProducts"> 
      <![CDATA[ANOTHERBUILDINSTALLED]]> 
     </Custom> 

     <LaunchConditions After="AppSearch" /> 
    </InstallUISequence> 

    <!-- .... --> 

</Product> 
1

Sé que este post es viejo y contestado, pero, en caso de que alguien se encuentre con esto, tuve problemas con mi instalador de actualización. Las secciones de actualización estaban bien. El instalador se ejecutaría, pero la versión anterior nunca se eliminó, por lo tanto, la nueva versión no se instaló. La cuestión era este

<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="0"> 

El nivel = "0" anterior, que debería haber sido Nivel = "1", ya que es a continuación:

<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="1"> 

de Scott

1

Si es de ninguna utilidad para aquellos que descubren este hilo, también he encontrado un problema similar que acabo de descubrir.

En mi caso (y aún estando en las primeras etapas de desarrollo de mi instalador), la diferencia fundamental fue que, entre las versiones, pasé de una instalación por usuario a una instalación por máquina. Más específicamente, había añadido la siguiente línea a mis Product.wxs:

<Property Id='ALLUSERS' Value='1'/> 

Todavía recibo mi cabeza en torno a muchas de las idiosincrasias de instaladores de Windows, pero me gustaría pensar que al cambiar el tipo de la instalación de esta manera sería comparable con el cambio a una secuencia de versiones mutuamente excluyentes de muchas maneras (¡incluso habilitando dos versiones idénticas para ser instaladas en paralelo!).

Es una pena que el Panel de control de Windows no distinga claramente entre las instalaciones que son por usuario y todos los usuarios.

Cuestiones relacionadas