Использую для установки программы msi сделанный WiX. Хочу сделать среднее обновление, т.е. меняю GUID пакета и номер версии в свойстве Product Version. При запуске нового msi пакета система ругается, что такая программа уже установлена, и её следует деинсталлировать. В документации предлагают запускать msi пакет с ключами. Можно ли как-то обойти эту проблему, т.е. запускать msi без ключей, но что бы он устанавливался? Если нельзя, то можно ли как-то из msi деинсталлировать старую версию и поставить новую?
Re: WiX обновление продукта без командной строки, как?
Здравствуйте, пустойчайник, Вы писали:
П>Использую для установки программы msi сделанный WiX. Хочу сделать среднее обновление, т.е. меняю GUID пакета и номер версии в свойстве Product Version. При запуске нового msi пакета система ругается, что такая программа уже установлена, и её следует деинсталлировать. В документации предлагают запускать msi пакет с ключами. Можно ли как-то обойти эту проблему, т.е. запускать msi без ключей, но что бы он устанавливался? Если нельзя, то можно ли как-то из msi деинсталлировать старую версию и поставить новую?
Я докомпилировал несколлько готовых msi с таким функционалом, и получил рабочее решение.
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product
Id="$(var.PRODUCTID)"
Language="1033"
Name="Product $(var.PRODUCTVERSION)"
UpgradeCode="{829BE326-BAD6-4978-ADA7-0A5EBE82B2BC}"
Version="$(var.PRODUCTVERSION)">
<Package
SummaryCodepage="1251"
Languages="1033"
Platforms="Intel"
ReadOnly="no"
Compressed="yes"
InstallerVersion="200"
/>
<Binary Id="WixUI_Bmp_Banner" SourceFile="SourceDir\Binary\WixUI_Bmp_Banner.bmp" />
<Binary Id="WixUI_Bmp_Dialog" SourceFile="SourceDir\Binary\WixUI_Bmp_Dialog.bmp" />
<Binary Id="WixUI_Ico_Exclam" SourceFile="SourceDir\Binary\WixUI_Ico_Exclam.bmp" />
<Binary Id="WixUI_Ico_Info" SourceFile="SourceDir\Binary\WixUI_Ico_Info.bmp" />
<Binary Id="WixUI_Bmp_New" SourceFile="SourceDir\Binary\WixUI_Bmp_New.bmp" />
<Binary Id="WixUI_Bmp_Up" SourceFile="SourceDir\Binary\WixUI_Bmp_Up.bmp" />
<Property Id="DiskPrompt" Value="[ProductName] installation package, [1]." />
<Property Id="WixUIRMOption" Value="UseRM" />
<Property Id="WIXUI_INSTALLDIR" Value="TARGETDIR" Secure="yes" />
<Property Id="ALLUSERS" Value="2" Secure="yes" />
<Property Id="FOLDERFORM_ALLUSERS" Value="ALL" Secure="yes" />
<Property Id="DISABLEADVTSHORTCUTS" Value="1" Secure="yes" />
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<Property Id="ErrorDialog" Value="ErrorDlg" />
<Property Id="NOUPGRADE" Secure="yes" />
<Property Id="CANNOTUPGRADENEWER" Secure="yes" />
<Property Id="CANNOTUPGRADESAME" Secure="yes" />
<Property Id="EXISTINGPRODUCTS" Secure="yes" />
<Property Id="INSTALLDIR" Secure="yes" />
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Condition Message="An administrator must approve or install [ProductName].">Privileged</Condition>
<Condition Message="[ProductName] can only be installed on Windows 2000 or a more recent version">VersionNT >= 500</Condition>
<Condition Message="Setup has detected that the same version of [ProductName] is already installed on your system. The installer can only upgrade from older versions. You should manually uninstall the conflicting product and then run the installation again.">NOT CANNOTUPGRADESAME OR Installed OR NOUPGRADE</Condition>
<Condition Message="Setup has detected that a newer version of [ProductName] is already installed on your system. The installer can only upgrade from older versions. You should manually uninstall the conflicting product and then run the installation again.">NOT CANNOTUPGRADENEWER OR Installed OR NOUPGRADE</Condition>
<Upgrade Id="{829BE326-BAD6-4978-ADA7-0A5EBE82B2BC}">
<UpgradeVersion Minimum="$(var.PRODUCTVERSION)" Maximum="$(var.PRODUCTVERSION)" Property="CANNOTUPGRADESAME" OnlyDetect="yes" IncludeMinimum="yes" IncludeMaximum="yes" />
<UpgradeVersion Minimum="$(var.PRODUCTVERSION)" Maximum="127.0.0" Property="CANNOTUPGRADENEWER" OnlyDetect="yes" IncludeMaximum="yes" />
<UpgradeVersion Minimum="0.0.0" Maximum="$(var.PRODUCTVERSION)" Property="EXISTINGPRODUCTS" MigrateFeatures="yes" IncludeMinimum="yes" />
</Upgrade>
<CustomAction Id="ERRCA_CANCELNEWERVERSION" Error="Unable to install because a newer version of this product is already installed." />
....
</Product>
</Wix>
MigrateFeatures="yes" должна запустить переустановку? Не запускается.
Пробовал вообще весь кусок кода, тоже самое "Установленна другая версия этого продукта ..." и все. Upgrade Id у меня совпадает с UpgradeCode продукта и один и тот же для всех версий программы.
Re[3]: WiX обновление продукта без командной строки, как?
Здравствуйте, пустойчайник, Вы писали:
П>MigrateFeatures="yes" должна запустить переустановку? Не запускается. П>Пробовал вообще весь кусок кода, тоже самое "Установленна другая версия этого продукта ..." и все. Upgrade Id у меня совпадает с UpgradeCode продукта и один и тот же для всех версий программы.
А ProdictID у тебя тоже совпадает? Они должны быть разными в разных версиях.
Здравствуйте, V.Petrovski, Вы писали:
VP>А ProdictID у тебя тоже совпадает? Они должны быть разными в разных версиях.
Что все ID разные? Но если ProdictID будет другой, то оно разве не встанет как еще один продукт. У меня так и получается, т.е. в папке, куда я инсталлирую, файлы переписываются, а Add/Remove списке, появляется еще одна программа. Может я акцию RemoveExistingProducts не так прописал? Она у меня после InstallFinalize запускается, как в примере.
Re[5]: WiX обновление продукта без командной строки, как?
Здравствуйте, пустойчайник, Вы писали:
П>Что все ID разные? Но если ProdictID будет другой, то оно разве не встанет как еще один продукт. У меня так и получается, т.е. в папке, куда я инсталлирую, файлы переписываются, а Add/Remove списке, появляется еще одна программа.
Я когда собираю новую версию, я в командой строке задаю номер версии и ProductID, причем для каждой версии свой ProductID.
Иначе не работает. Я в WiX не селен, но меня мое решение устраивает на 100%, при инстале новой версии, старая удаляется.
П>Может я акцию RemoveExistingProducts не так прописал? Она у меня после InstallFinalize запускается, как в примере.