2009-04-17 16 views
12

Utrzymuję aplikację dla wielu platform, opartą na PyQt, która działa na systemie Linux i Windows.Własna aktualizacja aplikacji py2exe/py2app

Wersje systemu Windows i Mac są dystrybuowane za pomocą py2exe i py2app, co powoduje tworzenie całkiem dużych pakietów (~ 40 MB).

chciałbym dodać „automatycznej aktualizacji” funkcjonalność, na podstawie poprawek do ograniczenia pobrań rozmiar:

  • Sprawdź dostępność nowych wersji na serwerze HTTP
  • pobrać patche potrzebne do aktualizacji do ostatniego wersja
  • zastosować listę łat i ponownie uruchomić aplikację

mam kilka pytań:

  • jaki jest preferowany sposób aktualizacji aplikacji systemu Windows, ponieważ otwarte pliki są zablokowane i nie można ich zastąpić?
  • Jak przygotować i zastosować poprawki? być może używając bsdiff/pspatch?

[aktualizacja]

Zrobiłem prostą klasę do wprowadzania poprawek z bsdiff, który jest bardzo wydajny, jak reklamowane na ich stronie: diff na dwóch py2exe wersji mojej aplikacji (~ 75 MB nieskompresowanych) tworzy łatkę 44 kB! Wystarczająco małe dla mnie, pozostanę przy tym formacie.

Kod jest dostępny w pakiecie "aktualizacja" pyflu, małej bibliotece kodu Pythona.

+0

Ciekawe, w jaki sposób planujesz poradzić sobie z aktualizacjami obejmującymi wiele wersji/aktualizacji. na przykład użytkownik ma 1,0, a do czasu, gdy następnym razem próbują go uruchomić, było (powiedzmy) 10 aktualizacji? Czy generowałbyś łatki na żądanie? Z buforowaniem chyba nie byłoby tak źle, ale zakładam, że masz dostępny kod po stronie serwera ... –

+1

Jeśli użytkownik pominął 10 aktualizacji, aktualizator pobierze 10 poprawek potrzebnych do przejścia do najnowszej wersji i zastosowania jednego o jeden. Nie ma kodu po stronie serwera, tylko prosty serwer apache pokazujący zawartość katalogów. –

Odpowiedz

4

Nie wierzę, że py2exe obsługuje poprawione aktualizacje.Jeśli jednak nie pakujesz całego pakietu w pojedynczy plik EXE (py2exe website example - dół strony), możesz uzyskać mniejsze aktualizacje, zastępując tylko niektóre pliki:, na przykład plik EXE. Może to znacznie zmniejszyć rozmiar twoich aktualizacji.

Możesz napisać osobną aplikację aktualizującą , którą można pobrać/uruchomić z poziomu aplikacji. Ta aplikacja może być inna dla każdej aktualizacji, ponieważ pliki, które wymagają aktualizacji mogą ulec zmianie.

Gdy aplikacja uruchomi aktualizator, będzie musiała zamknąć się, aby pliki mogły zostać nadpisane. Po zakończeniu aktualizacji można go ponownie otworzyć przed zamknięciem.

+0

Z czystej ciekawości, dlaczego plik wykonywalny Pythona, czy jakikolwiek inny plik wykonywalny, nie obsługuje binarnych poprawek? Czy nie jest to łata binarna tylko NewVersion.exe minus OldVersion.exe, z łatką zmieniającą bajty niezbędne do utworzenia NewVersion.exe? – ryeguy

3

Nie wiem o patchach, ale na OS X "standard" w tym z aplikacjami kakao to Sparkle. Zasadniczo robi "appcasting". To pobiera pełną aplikację za każdym razem. Warto na niego spojrzeć z inspiracji.

Wyobrażam sobie, że na OS X prawdopodobnie można pobrać rzeczywistą część pakietu aplikacji, która zawiera konkretny kod (nie pliki bibliotek itp., Które są pakowane), a to byłoby dość małe i łatwe do zastąpienia w pakiecie .

W systemie Windows najprawdopodobniej uda się zrobić podobną sztuczkę, nie łącząc aplikacji w jeden plik exe, co pozwoli zmienić jeden plik, który faktycznie się zmienił.

Wyobrażam sobie, że Twój aktualny kod w Pythonie byłby znacznie mniejszy niż 40 MB, więc prawdopodobnie jest to właściwy sposób.

Jeśli chodzi o zastąpienie uruchomionej aplikacji, najpierw musisz znaleźć jej lokalizację, aby można było użyć numeru sys.executable, aby uzyskać punkt wyjściowy, możesz prawdopodobnie przekazać proces potomny, zabić proces nadrzędny i mieć dziecko robi rzeczywistą wymianę?

Obecnie gram z małą aplikacją wxPython i zastanawiam się dokładnie nad tym problemem. Chciałbym usłyszeć o tym, co wymyślisz.

Również, jak duża jest Twoja aplikacja po skompresowaniu? Jeśli kompresuje się dobrze, może nadal możesz pozwolić sobie na wysłanie tego wszystkiego.

+1

Aplikacja ma 40 MB * skompresowanej * :) To wszystko biblioteki DLL i środowisko uruchomieniowe Pythona, które zajmuje większość tego, mój kod ma tylko 500 KB. –

1

Ponieważ py2exe umieszcza wszystkie skompilowane moduły aplikacji w pliku ZIP, możesz spróbować zaktualizować ten plik, tworząc skrypt aktualizujący go z danego zestawu plików. Następnie należy wymienić pozostałe pliki, które uległy zmianie (które powinny być nieliczne, jeśli występują).

+0

Czasami chcesz również zaktualizować biblioteki DLL (np. Zmieniając wersję Qt, dodając nowe zależności modułów rozszerzeń, itp.), Nie chcę sprawdzać ręcznie, czy wszystko działa za każdym razem, gdy wydaję wersję. –

0

Stary post, ale pomyślałem, że wspomnę o pyupdate z pec instalatorem.

Obsługuje Amazon i scp.

W przyszłości, zgodnie z ostatnimi postami github, planują wspierać darmowe alternatywy.

Powiązane problemy