W pracy używamy WiX do budowania pakietów instalacyjnych. Chcemy, aby instalacja produktu X spowodowała odinstalowanie poprzedniej wersji tego produktu na tym komputerze.
Czytałem w kilku miejscach w Internecie o dużym uaktualnieniu, ale nie mogłem go uruchomić. Czy ktoś może podać dokładne kroki, które muszę wykonać, aby dodać funkcję odinstalowania poprzedniej wersji do WiX?
installer
wix
windows-installer
Dror Helper
źródło
źródło
<MajorUpgrade>
” należy umieścić po<Package>
. W przeciwnym raziecandle
pojawia się następujący błąd: „błąd CNDL0107: Sprawdzanie poprawności schematu nie powiodło się z następującym błędem w wierszu 1, kolumna 473: Element„ Produkt ”w przestrzeni nazw„ schemas.microsoft.com/wix/2006/wi ”ma nieprawidłowy element potomny” MajorUpgrade „in namespace” schemas.microsoft.com/wix/2006/wi ”. Spodziewana lista możliwych elementów:„ Package ”.”.AllowDowngrades
aniAllowSameVersionUpgrades
. Domyślnie już nie.Wreszcie znalazłem rozwiązanie - zamieszczam je tutaj dla innych osób, które mogą mieć ten sam problem (wszyscy 5 z was):
W ramach produktu dodaj:
W obszarze InstallExecuteSequence dodaj:
Od teraz, kiedy instaluję produkt, usuwałem poprzednie zainstalowane wersje.
Uwaga: zastąp identyfikator aktualizacji własnym identyfikatorem GUID
źródło
ProductVersion
obsługuje tylko trzy pola wersji; dlatego czwarte pole nie będzie w ogóle porównywane. Zobacz uwagę pod VersionMin i VersionMax w msdn.microsoft.com/en-us/library/aa372379(VS.85).aspxOto rodzaj składni, której używam do głównych aktualizacji:
Jak zauważył @Brian Gillespie, istnieją inne miejsca do zaplanowania RemoveExistingProducts w zależności od pożądanych optymalizacji. Uwaga: PUT-GUID-HERE musi być identyczny.
źródło
<InstallExecute After="RemoveExistingProducts" />
. Twój przykład tego nie ma - czy to znaczy, że książka jest zła?Element aktualizacji w elemencie produktu w połączeniu z odpowiednim zaplanowaniem akcji spowoduje odinstalowanie, którego szukasz. Pamiętaj, aby podać kody aktualizacji wszystkich produktów, które chcesz usunąć.
Pamiętaj, że jeśli jesteś ostrożny ze swoimi kompilacjami, możesz zapobiec przypadkowemu zainstalowaniu starszej wersji Twojego produktu na nowszej. Do tego służy pole Maximum. Kiedy budujemy instalatory, ustawiamy UpgradeVersion Maximum do tworzonej wersji, ale IncludeMaximum = „no”, aby zapobiec temu scenariuszowi.
Masz do wyboru harmonogram planowania RemoveExistingProducts. Wolę zaplanować to po InstallFinalize (niż po InstallInitialize, jak zalecili inni):
Pozostawia to poprzednią wersję produktu zainstalowaną do momentu skopiowania nowych plików i kluczy rejestru. To pozwala mi migrować dane ze starej wersji do nowej (na przykład zmieniłeś przechowywanie preferencji użytkownika z rejestru na plik XML, ale chcesz być uprzejmy i migrować ich ustawienia). Ta migracja jest wykonywana w odroczonej akcji niestandardowej tuż przed InstallFinalize.
Kolejną korzyścią jest wydajność: jeśli istnieją niezmienione pliki, Instalator Windows nie zawraca sobie głowy kopiowaniem ich ponownie, gdy planujesz po InstallFinalize. Jeśli planujesz po InstallInitialize, poprzednia wersja jest najpierw całkowicie usuwana, a następnie instalowana jest nowa wersja. Powoduje to niepotrzebne usuwanie i ponowne kopiowanie plików.
Aby zapoznać się z innymi opcjami planowania, zobacz temat pomocy RemoveExistingProducts w MSDN. W tym tygodniu link to: http://msdn.microsoft.com/en-us/library/aa371197.aspx
źródło
RemoveExistingProducts
zostało zaplanowane na później,InstallFinalize
a biblioteki DLL nie były aktualizowane, ponieważ assemblyVersion nie uległo zmianie, ale inne pola, takie jak AssemblyProduct, były. Nie chcę być na łasce procedury porównywania plików - chcę tylko poprzedniej aplikacji GONEByć może lepiej zapytać o to na liście mailingowej użytkowników WiX .
Z WiX najlepiej jest korzystać przy dokładnym zrozumieniu działania Instalatora Windows. Możesz rozważyć uzyskanie „ Przewodnika po Instalatorze Windows ”.
Działanie, które usuwa istniejący produkt, jest działaniem RemoveExistingProducts . Ponieważ konsekwencje tego, co robi, zależą od tego, gdzie jest zaplanowane - mianowicie, czy awaria powoduje ponowną instalację starego produktu i czy niezmienione pliki są ponownie kopiowane - musisz sam to zaplanować.
RemoveExistingProducts
przetwarza<Upgrade>
elementy w bieżącej instalacji, dopasowując@Id
atrybut doUpgradeCode
(określonego w<Product>
elemencie) wszystkich zainstalowanych produktów w systemie.UpgradeCode
Definiuje rodzinę produktów pokrewnych. Wszelkie produkty, które mają ten kod aktualizacji, których wersje mieszczą się w określonym zakresie i w którychUpgradeVersion/@OnlyDetect
atrybut jestno
(lub jest pominięty), zostaną usunięte.Dokumentacja dla
RemoveExistingProducts
wspomina o ustawianiuUPGRADINGPRODUCTCODE
właściwości. Oznacza to, że proces odinstalowywania usuwanego produktu otrzymuje tę właściwość, której wartością jestProduct/@Id
produkt, który jest instalowany.Jeśli oryginalna instalacja nie zawierała
UpgradeCode
, nie będzie można korzystać z tej funkcji.źródło
Skorzystałem z tej witryny, aby pomóc mi zrozumieć podstawy aktualizacji WiX:
http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization
Następnie utworzyłem przykładowy instalator (zainstalowałem plik testowy), a następnie utworzyłem instalatora uaktualnienia (zainstalowałem 2 przykładowe pliki testowe). To da ci podstawowe zrozumienie działania mechanizmu.
I jak powiedział Mike w książce Apress „The Definitive Guide to Windows Installer”, pomoże ci to zrozumieć, ale nie jest napisane przy użyciu WiX.
Inną stroną, która była bardzo pomocna, była ta:
http://www.wixwiki.com/index.php?title=Main_Page
źródło
Przeczytałem dokumentację WiX , pobrałem przykłady, ale wciąż miałem wiele problemów z aktualizacjami. Niewielkie uaktualnienia nie powodują odinstalowania poprzednich produktów, pomimo możliwości ich określenia. Spędziłem ponad jeden dzień na badaniach i odkryłem, że WiX 3.5 wprowadził nowy tag do aktualizacji. Oto użycie:
Ale główną przyczyną problemów było to, że dokumentacja mówi o używaniu parametrów „ REINSTALL = ALL REINSTALLMODE = vomus ” w przypadku drobnych i małych aktualizacji, ale nie oznacza to, że parametry te są ZABRONIONE w przypadku dużych aktualizacji - po prostu przestają działać. Dlatego nie powinieneś używać ich z ważnymi aktualizacjami.
źródło
Proponuję rzucić okiem na samouczek Alexa Szewczuka. Wyjaśnia „poważną aktualizację” poprzez WiX z dobrym praktycznym przykładem z MSI na WiX, część 8 - Ważna aktualizacja .
źródło
Jedną ważną rzeczą, za którą tęskniłem na chwilę od samouczków (skradziony z http://www.tramontana.co.hu/wix/lesson4.php ), co spowodowało błędy „Inna wersja tego produktu jest już zainstalowana”:
* Małe aktualizacje oznaczają niewielkie zmiany w jednym lub kilku plikach, w przypadku których zmiana nie gwarantuje zmiany wersji produktu (major.minor.build). Nie musisz również zmieniać identyfikatora GUID produktu. Pamiętaj, że zawsze musisz zmienić GUID pakietu podczas tworzenia nowego pliku .msi, który pod każdym względem różni się od poprzednich. Instalator śledzi zainstalowane programy i znajduje je, gdy użytkownik chce zmienić lub usunąć instalację za pomocą tych identyfikatorów GUID. Użycie tego samego identyfikatora GUID dla różnych pakietów wprowadzi instalatora w błąd.
Niewielkie aktualizacje oznaczają zmiany, w przypadku których wersja produktu już się zmieni. Zmodyfikuj atrybut Version znacznika Product. Produkt pozostanie taki sam, więc nie trzeba zmieniać identyfikatora GUID produktu, ale oczywiście uzyskać nowy identyfikator GUID pakietu.
Główne aktualizacje oznaczają znaczące zmiany, takie jak przejście z jednej pełnej wersji do drugiej. Zmień wszystko: atrybut wersji, identyfikatory GUID produktów i pakietów.
źródło
Korzystam z najnowszej wersji WiX (3.0) i nie mogłem uruchomić powyższej wersji. Ale to zadziałało:
Pamiętaj, że PUT-GUID-HERE powinien być taki sam jak GUID, który zdefiniowałeś we właściwości UpgradeCode produktu.
źródło
Poniżej działało dla mnie.
Upewnij się, że kod aktualizacji w produkcie jest zgodny z identyfikatorem w aktualizacji.
źródło
To właśnie działało dla mnie, nawet przy dużej klasie DOWN :
źródło