metaetiqueta - cómo obtener wix para actualizar una versión previamente instalada de un programa
metaetiqueta wix (5)
necesitas usar la tabla de actualización:
< Upgrade Id=''15E2DAFB-35C5-4043-974B-0E342C25D76A''>
< UpgradeVersion Property=''OLDVERSIONFOUND'' IncludeMinimum=''no'' Minimum=''0.0.0.0'' />
< /Upgrade>
también necesita agregar una acción:
< InstallExecuteSequence>
< LaunchConditions After=''AppSearch'' />
< RemoveExistingProducts After=''InstallValidate'' />
< /InstallExecuteSequence>
Escribí un programa de instalación con wix y funcionó bien para instalar mi programa. Ahora necesito actualizarlo, así que aumenté el número de versión, pero cuando voy a instalar el nuevo programa sobre el anterior, me queja de que ya hay una versión anterior instalada y me dice que primero la desinstale.
¿Cómo puedo actualizarlo o desinstalarlo automáticamente antes de volver a instalarlo?
Revisé todas las publicaciones mencionadas anteriormente y todavía pasé siglos tratando de hacer que esto funcione.
La sugerencia del CÓMO oficial para las actualizaciones en el Paso 3 fue de gran ayuda: necesita un nuevo Product/@Id
para desactivar el mensaje "Ya está instalada otra versión de este producto".
Utilicé esta sección de actualización (hijo de Producto):
<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion Minimum="1.0.0"
IncludeMinimum="yes"
OnlyDetect="no"
Maximum="$(var.Version)"
IncludeMaximum="no"
Property="PREVIOUSFOUND" />
</Upgrade>
Tenga en cuenta que OnlyDetect
está establecido en "no". Esto desencadena la eliminación de la versión anterior, si tiene la siguiente sección (hijo del Producto):
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize"/>
</InstallExecuteSequence>
También tenga en cuenta que, al parecer, solo los tres primeros componentes del número de versión se utilizan para buscar actualizaciones ...
Simplemente coloque este elemento debajo del elemento Product
:
<MajorUpgrade AllowDowngrades="yes" />
Más información en este HowTo
Siento que ninguna de las respuestas proporcionadas es completa o independiente, así que después de abrirme camino a través de este pantano, aquí están los pasos que creo que son necesarios para lograr que el requisito (completamente evidente) de una actualización funcione:
Asegúrese de que su ID de producto cambie cada vez que construya. Si no lo hace, siempre recibirá el mensaje "ya instalado" que mencionó el OP.
<Product Id="*" ...>
Cambie la versión del producto cada vez que cambie el producto. Supongo que la mejor opción es vincularlo a una versión de ensamblaje (que también debe incrementarse automáticamente), pero, por supuesto, también podría cambiarlo manualmente. Este paso no es estrictamente necesario si usa el atributo AllowSameVersionUpgrades en el punto 4, pero me atrevería a decir que mantener la versión de su producto constante es una mala práctica en cualquier caso.
<Product Version="!(bind.FileVersion.MyAssemblyDll)" ...> <File Id="MyAssemblyDll" Name="$(var.001_Application.MyAssembly.TargetFileName)" Source="$(var.001_Application.MyAssembly.TargetPath)" />
Mantenga su UpgradeCode constante (por ejemplo):
<Product UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be" ...>
Agregue el elemento MajorUpgrade (desde Wix 3.5.1315.0). Para circunnavegar la captura de que MajorUpgrade ignorará los cambios en el número de revisión de la versión del producto, agregue el atributo AllowSameVersionVersionUpgrades (o si prefiere AllowDowngrades). De esta manera, podrá actualizar de, por ejemplo,
1.0.0.7
a1.0.0.8
. y no solo de1.0.7.0
a1.0.8.0
. Si no lo hace, puede ver varias instalaciones en Programas y características.<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
Aquí está mi archivo completo .wix (las partes relevantes, los dos fragmentos que conducen al ensamblaje que se utiliza para el enlace del producto son en su mayoría opcionales y, a modo ilustrativo, cualquier forma en que pueda obtener el ensamblaje funcionará):
<?xml version="1.0" encoding="UTF-8"?>
<?define ProductVersion="!(bind.FileVersion.MyAssemblyDll)"?>
<?define UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
<Product
Id="*"
Name="My Product''s name"
Language="1033"
Version="$(var.ProductVersion)"
Manufacturer="My company"
UpgradeCode="$(var.UpgradeCode)"
Codepage="1252">
<Package
InstallerVersion="200"
Compressed="yes"
InstallScope="perUser"
Description="My product description"
Manufacturer="My company"
Languages="1033"
SummaryCodepage="1252"
InstallPrivileges="limited" />
<MajorUpgrade AllowSameVersionUpgrades="yes"
DowngradeErrorMessage="A newer version of [ProductName] is already installed. If you are sure you want to downgrade, remove the existing installation via Programs and Features." />
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="LocalAppDataFolder">
<Directory Id="INSTALLFOLDER" Name="My Install Dir" >
<Component Id="INSTALLFOLDER" Guid="f6ba8a12-6493-4911-8edd-dce90e1d8e8b" >
<RemoveFolder On="both" Id="INSTALLFOLDER"/>
<RegistryValue Root="HKCU" Key="Software/[Manufacturer]/[ProductName]" Type="string" Value="My Registry value" />
</Component>
</Directory>
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" >
<Component Id="ProductComponent" Guid="1939f0f5-19f6-498b-bf95-8f1c81501294" DiskId="1" Directory="INSTALLFOLDER" >
<File Id="MyAssemblyDll" Name="$(var.001_MyApplication.MyAssembly.TargetFileName)" Source="$(var.001_MyApplication.MyAssembly.TargetPath)" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
Intenté esto y funcionó para mí.
- Coloque su etiqueta de producto así:
Identificación del producto = "*" Nombre = "Algo" Idioma = "1033" Versión = "1.0.0.0" Fabricante = "Alguien" UpgradeCode = "43ab28d7-6681-4a05-a6b5-f980733aeeed"
Id del producto debe establecerse en * para que cada vez que construya su proyecto, tome una identificación diferente.
- Nest una etiqueta MajorUpgrade dentro de su elemento de paquete que se ve así:
MajorUpgrade AllowDowngrades = "no" DowngradeErrorMessage = "Ya está instalada una versión más reciente de [ProductName]". AllowSameVersionUpgrades = "yes" /
Por lo tanto, cada vez que actualice su versión (o su versión sea la misma, no menos que la versión actual), reinstala su producto eliminando los archivos anteriores e instalando los archivos del producto. No degradará su producto.