Hacer una actualización importante en Wix crea 2 entradas en Agregar o quitar programas
windows-installer major-upgrade (2)
He seguido la guía oficial de actualización importante y parece que me falta algo. Aquí está mi MCVE :
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Codepage="1252" Language="1033" Manufacturer="Bla Corporation"
Name="Bla" UpgradeCode="PUT-GUID-HERE" Version="31.00.0000">
<Package Comments="Contact: Refael Sheinker, [email protected]." Description="Bla"
InstallerVersion="500"
Compressed="yes"
InstallScope="perMachine"
Keywords="Installer,MSI,Database" Languages="1033" Manufacturer="Bla Corporation" Platform="x64" />
<Media Id="1" Cabinet="my_application.cab" EmbedCab="yes" />
<MajorUpgrade AllowDowngrades="no"
AllowSameVersionUpgrades="no"
Disallow="no"
IgnoreRemoveFailure="no"
MigrateFeatures="yes"
Schedule="afterInstallInitialize"
DowngradeErrorMessage="A later version of [ProductName] is already installed" />
<Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONROOTDIRECTORY" />
<UIRef Id="WixUI_InstallDir" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="PROGRAMFILESSUBDIR" Name="Bla">
<Directory Id="APPLICATIONROOTDIRECTORY" Name="BlaInternal" />
</Directory>
</Directory>
</Directory>
<DirectoryRef Id="APPLICATIONROOTDIRECTORY">
<Component Id="tenlira.ini" Guid="*">
<File Id="tenlira.ini" Source="../ConfigurationFile/x64/tenlira.ini" KeyPath="yes" />
</Component>
</DirectoryRef>
<Feature Id="MainApplication" Title="TenLira" Level="1">
<ComponentRef Id="tenlira.ini" />
</Feature>
</Product>
</Wix>
Todo lo que hace es simplemente instalar un solo archivo como ejemplo.
Hasta ahora tan bueno.
Ahora, todo lo que hago es agregar otro
Component
y
File
y, por supuesto, el
ComponentRef
correspondiente en la
Feature
.
Dejo específicamente la
Version
como está: 31.00.0000.
Lo que esperaba es que el nuevo instalador
no
realice una actualización importante, pero lo hace.
¿Por qué?
Además, ahora hay 2 entradas en Agregar o quitar programas.
Por favor, ayúdame a descubrir qué me estoy perdiendo aquí. Gracias. Refael
ACTUALIZACIÓN
: Al publicar la pregunta, volví a leer la documentación nuevamente y descubrí que la cosa
AllowSameVersionUpgrades
en el elemento
MajorUpgrade
debería establecerse en
yes
.
Esta vez solo hay una entrada en los Programas Agregar / Eliminar, pero aún así realiza la Actualización Mayor.
¿Por qué?
Actualización importante: "La forma antigua y manual"
Supongo que está llegando a una rareza que puede no ser manejada completamente como se esperaba por el elemento WiX MajorUpgrade combinando el
auto-generated product GUID
, el
AllowSameVersionUpgrades
establecido en
yes
y manteniendo el
version number
igual.
No puedo ver ninguna forma obvia de establecer el atributo MinInclusive en el elemento MajorUpgrade de WiX: podría estar equivocado, podría haber una forma que desconozco. Por lo que vale, no estoy demasiado interesado en permitir "actualizaciones de la misma versión".
Sin embargo, puede intentar "
usar la forma antigua
" para crear la
tabla de actualización
utilizando los "elementos más antiguos"
Upgrade
y
UpgradeVersion
.
El
elemento MajorUpgrade
es esencialmente una función de "conveniencia" para configurar sus actualizaciones principales fácilmente, y creo que funciona para la mayoría de los usuarios.
Bob Arnson tiene un blog que explica la introducción del elemento MajorUpgrade
.
Este blog también muestra una muestra de cómo hacer las cosas "manualmente" con los "elementos más antiguos"
Upgrade
y
UpgradeVersion
(
UpgradeVersion
).
Hice una maqueta rápida que podría hacer lo que quieres, es solo un "borrador", no puedo hacer ninguna garantía. Utilizo las definiciones de preprocesador para establecer algunas variables a las que se puede hacer referencia en el archivo fuente de WiX; como desarrollador de C ++, esto es pan comido para usted, así que no perderé tiempo explicándolo; la fuente debería tener sentido:
<?define MyProductVersion = "31.00.0000" ?>
<?define MyProductCode = "PUT-GUID-HERE" ?>
<?define MyUpgradeCode = "PUT-GUID-HERE" ?>
<!--Recommendation: set a path variable that you can redirect at will to a new release folder (new build output folder): -->
<!-- <?define MyBasePath = "C:/Projects/MyApp/Release/31.00.0000/" ?> -->
<!-- SAMPLE:
<Component Win64="yes" Feature="MainApplication">
<File Source="$(var.MyBasePath)/myapp.exe" />
</Component> -->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="$(var.MyProductCode)" Codepage="1252" Language="1033" Manufacturer="Bla Corporation"
Name="Bla" UpgradeCode="$(var.MyUpgradeCode)" Version="$(var.MyProductVersion)">
<Package Comments="Contact: Refael Sheinker, [email protected]." Description="Bla"
InstallerVersion="500"
Compressed="yes"
InstallScope="perMachine"
Keywords="Installer,MSI,Database" Languages="1033" Manufacturer="Bla Corporation" Platform="x64" />
<Media Id="1" Cabinet="my_application.cab" EmbedCab="yes" />
<!-- Major upgrade -->
<Upgrade Id="$(var.MyUpgradeCode)">
<!-- Downgrade Protection -->
<UpgradeVersion Minimum="$(var.MyProductVersion)" OnlyDetect="yes" IncludeMinimum="yes" Property="DOWNGRADE_DETECTED" />
<!-- Major Upgrade Configuration -->
<UpgradeVersion IncludeMinimum="no" Maximum="$(var.MyProductVersion)" IncludeMaximum="no" MigrateFeatures="yes" Property="UPGRADE_DETECTED" />
</Upgrade>
<!-- Major Upgrade: Schedule RemoveExistingProducts -->
<InstallExecuteSequence>
<!-- Potential scheduling (after): InstallValidate, InstallInitialize, InstallExecute, InstallExecuteAgain, InstallFinalize -->
<RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>
<!--Launch Condition: Abort setup if higher version found-->
<Condition Message="!(loc.NewerVersionDetected)">
NOT DOWNGRADE_DETECTED
</Condition>
<Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONROOTDIRECTORY" />
<UIRef Id="WixUI_InstallDir" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="PROGRAMFILESSUBDIR" Name="Bla">
<Directory Id="APPLICATIONROOTDIRECTORY" Name="BlaInternal" />
</Directory>
</Directory>
</Directory>
<DirectoryRef Id="APPLICATIONROOTDIRECTORY">
<Component Id="Test.ini" Guid="PUT-GUID-HERE" Win64="yes" Feature="MainApplication">
<CreateFolder Directory="APPLICATIONROOTDIRECTORY" />
<IniFile Id="SomeSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting1" Name="Test.ini" Section="MySection" Value="Some Setting" />
<IniFile Id="OtherSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting2" Name="Test.ini" Section="MySection" Value="Other Setting" />
</Component>
</DirectoryRef>
<Feature Id="MainApplication" Title="TenLira" Level="1">
<!--<ComponentRef Id="tenlira.ini" />-->
</Feature>
</Product>
</Wix>
Ahora se debe explicar el
!(loc.NewerVersionDetected)
.
Esta es una cadena localizada (para entregar su configuración en diferentes idiomas).
Para usarlo, haga clic derecho en su proyecto WiX en Visual Studio y vaya:
Add New Item... => Localization File => Add
.
A medida que se agrega el archivo de localización, su MSI de salida ahora también irá a una carpeta
en-us
debajo de su ubicación de salida principal (Depurar o liberar).
En el archivo de localización, agregue:
<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
<String Id="NewerVersionDetected">A later version of [ProductName] is already installed.</String>
</WixLocalization>
Y ahora debería poder agregar nuevas cadenas a este archivo y traducir fácilmente toda su configuración utilizando dichos archivos de idioma.
Agregue también la extensión de la GUI de WiX.
Right click "References". Add Reference... => Browse to WixUIExtension.dll => Double click this file, and press OK
Right click "References". Add Reference... => Browse to WixUIExtension.dll => Double click this file, and press OK
.
La carpeta normal para encontrar el archivo es:
C:/Program Files (x86)/WiX Toolset v3.11/bin
.
Archivos INI
Solo quiero mencionar que los archivos INI deberían instalarse idealmente a través de la tabla IniFile (las entradas se tratan como pares clave-valor atómicos que permiten la fusión avanzada de claves y valores para archivos INI existentes), y no a través de la tabla Archivo (el archivo se trata como un archivo normal, sobrescribiendo todo el archivo existente o dejándolo en su lugar, sin forzar ningún valor nuevo). El elemento WiX correspondiente a la tabla MSI IniFile es naturalmente el elemento IniFile .
Una muestra ad-hoc:
<Component Id="Test.ini" Guid="PUT-GUID-HERE" Win64="yes" Feature="MainApplication">
<CreateFolder Directory="APPLICATIONROOTDIRECTORY" />
<IniFile Id="SomeSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting1" Name="Test.ini" Section="MySection" Value="Some Setting" />
<IniFile Id="OtherSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting2" Name="Test.ini" Section="MySection" Value="Other Setting" />
</Component>
Realiza una actualización importante porque ambos MSI tienen el mismo UpgradeCode y ahora ha especificado AllowSameVersionUpgrades, por lo que realiza la actualización donde no la tenía antes.
Su compilación genera un nuevo ProductCode cada vez, por lo que cada MSI es un producto nuevo, por lo que lo instalará dos veces si no realiza una actualización y una vez si lo hace. Es posible que tenga alguna suposición sobre la forma en que funcionan las actualizaciones que no ha explicado.