2013-02-28 6 views
21

Mam bardzo prosty projekt WiX (wersja 3.7), który instaluje pliki somes (program .NET w wersji 6.0.0.0). Jestem gotowy do wydania nowej wersji 6.0.1.0 z wykorzystaniem funkcji MajorUpgrade w WiX.Główne uaktualnienie wix nie instalowanie wszystkich plików

jestem utrzymując UpgradeCode samo w elemencie Produktu i zmienić wersję z 6.0.0.0 do 6.0.1.0

<Product Id="*" Name="MyApp" Version="6.0.1.0" Manufacturer="Me" 
     UpgradeCode="$(var.TheUpgradeCodeGUID)"> 

na maszynie z zainstalowanym 6.0.0.0, uruchomić nowy instalator .

Usunięcie starej wersji 6.0.0.0 działa poprawnie (wszystkie zainstalowane pliki są usuwane), ale gdy instalator kontynuuje instalację nowej wersji, brakuje 2 plików: plik DLL strony trzeciej i plik EXE innej firmy (które nie zostały zmienione) nie są instalowane ponownie.

<Component Id="AutomaticUpdaterWPF.dll" Guid="*"> 
     <File Id="AutomaticUpdaterWPF.dll" Source="AutomaticUpdaterWPF.dll" KeyPath="yes" Checksum="yes" /> 
</Component> 
<Component Id="wyUpdaterProgram" Guid="*"> 
     <File Id="wyUpdaterProgram" Source="wyUpdate.exe" KeyPath="yes" Checksum="yes" /> 
</Component> 

Wszystkie inne pliki w < ComponentGroup> (niektóre zmodyfikowane niektóre niemodyfikowana wł. DLL innych 3rd party) są prawidłowo zainstalowane podczas poważnej modernizacji.

Po kliknięciu "Napraw" po aktualizacji głównej, 2 brakujące pliki pojawią się ponownie. Ponadto, jeśli zainstaluję wersję 6.0.1.0 po raz pierwszy (bez aktualizacji, ale pierwszej instalacji na czystym komputerze), to te 2 pliki są instalowane bezpośrednio i normalnie. (testowane na kilku komputerze z systemem Windows (XP, 7 i 8)

ktoś jakieś sugestie co jest nie tak i jak to naprawić?

+0

Czy próbowałeś przeprowadzić instalację z pełnym logowaniem, aby sprawdzić, dlaczego nie są instalowane? – ChrisPatrick

+0

Plik dziennika instalacji znajduje się tutaj: http://pastebin.com/tsf9C1pS – Robbie

Odpowiedz

23

Podany plik dziennika pokazuje, że nowsze wersje kilku plików znajdują się już na maszynie:

MSI (s) (0C:5C) [16:13:25:890]: Disallowing installation of component: {015A4DC1-56F4-562B-96B5-B3BE0D45FA5F} since the same component with higher versioned keyfile exists 
MSI (s) (0C:5C) [16:13:25:890]: Disallowing installation of component: {4B6A1404-3892-5BEF-AB47-8FE3149211A4} since the same component with higher versioned keyfile exists 

Widziałem ten problem z tym aktualizatorem w przeszłości. Christopher ma rację. Aktualizator zaktualizował swoje pliki, ale nie poinformował MSI (nie aktualizuje MSI, co nie jest poprawne). Nowy MSI myśli, że nowsze rzeczy są na maszynie, nie instaluje swoich plików, ale podczas aktualizacji stary pakiet usuwa pliki (nie zauważa, że ​​wersje są nowsze). Ponieważ nowy instalator zdecydował się nie instalować plików, które kończą się z niczym ... aż do naprawy.

Aby obejść problem, musisz przenieść działanie RemoveExistingProducts później. Jeśli używasz elementu MajorUpgrade, to powinno wystarczyć wykonanie Schedule='afterInstallExecute' lub Schedule='afterInstallFinalize'. Musisz być bardziej ostrożny z Component Rules.

Ponadto, IMHO, zewnętrzny dostawca nie powinien aktualizować plików poza MSI. Ich decyzja zmusza twój produkt do szczególnego sposobu ulepszenia.

+0

Cześć Rob, dzięki za tę imponującą analizę. Twoje rozwiązanie działa! Co więcej, wskazałeś mi właściwy kierunek przyczyny problemu. Na maszynie budującej plik AutomaticUpdater.dll został w rzeczywistości automatycznie zaktualizowany do wyższej wersji niż na mojej maszynie programistycznej, na której tworzyłem nową kompilację/instalację. Wynik jest dokładnie taki, jak opisałeś. Twoje rozwiązania działają i po uaktualnieniu komputera programistycznego do tej samej wersji narzędzia innej firmy, co na komputerze kompilacji, mogłem również rozwiązać problem. Jest to dla mnie bardzo ważne w przyszłości. – Robbie

+0

Wiele razy widziałem tego typu problemy w Continental Airlines, gdzie mieliśmy zainstalowane aplikacje, które były początkowo wdrażane za pomocą narzędzi takich jak SMS/Wise, a zespół aplikacji robił własne aktualizacje automatyczne poza oficjalnym pojazdem dostawczym. Musiałbym wykonać "wymuszoną deinstalację", aby wyczyścić linię bazową, aby MSI mógł zejść na dół, a następnie pokonać zespoły pracujące nad głowami, aby uzyskać automatyczne aktualizacje, by ostatecznie zamknąć pętlę MSI. –

+0

Czempion! Dzięki Rob, zaoszczędzone godziny (dni?) Bólu serca dla mnie bez wątpienia. –

5

Plik dziennika pomoże. Domyślam się, że to na podstawie którego zostały zaplanowane RemoveExistingProducts: Widziałem sytuacje, w których kalkulacja kosztów zakłada, że ​​instalowany plik jest taki sam, jak plik już zainstalowany i nie chce zainstalować pliku, a następnie następuje aktualizacja i kończy się brak pliku. plik nie istnieje, a kalkulacja kosztów zakłada, że ​​musi on zostać zainstalowany

+0

Plik dziennika instalacji znajduje się tutaj: http://pastebin.com/tsf9C1pS (mam nadzieję, że to pomoże) – Robbie

+0

Tak, pomogłoby to. Moje domysły są jednak zazwyczaj na miejscu. :) –

0

W starszych wersjach Instalatora Windows problem został udokumentowany tutaj:

https://support.microsoft.com/en-us/kb/905238

Lista produktów objętych inplies że to ustalone w silniku MSI 4.0 i nowszych. Korzystanie z 4.5 redystrybucji przed instalacją powinno pomóc, jeśli dotyczy wersji systemu operacyjnego.

0

Błąd nadal występuje w instalatorze 5.0 i nadal stanowi problem. Obejście problemu z umieszczeniem RemoveExistingProduct po InstallFinalize nie jest rozwiązaniem dla nas. Zmusiłem aktualizację według ustawienia właściwości dla pojedynczego pliku.

To rozwiązanie działa teraz dla nas.