LazAutoUpdater/pl
From Lazarus wiki
Jump to navigationJump to search
│
English (en) │
polski (pl) │
русский (ru) │
Streszczenie
- LazAutoUpdate to wizualny komponent dla środowiska Lazarus/FPC IDE, który ułatwia i usprawnia aktualizowanie aplikacji ze źródła online.
- Podczas tworzenia aplikacji do dystrybucji, kodowanie procesu aktualizacji dla użytkowników może być kłopotliwe, ale użytkownicy doceniają tę łatwość (o ile nie jest to dla nich wymuszone!), a wsparcie jest łatwiejsze, jeśli wiesz, że użytkownik ma zawsze najbardziej aktualną wersję Twojej aplikacji. LazAutoUpdate został zaprojektowany tak, aby dobrze integrował się z kontrolą wersji SourceForge lub GitHub, zapewniając bezproblemowe działanie dla Ciebie i Twoich użytkowników.
- LazAutoUpdate pobierane jest za pośrednictwem wątku w tle, dzięki czemu użytkownik może kontynuować korzystanie z aplikacji bez przerw
- Oznacza to na przykład, że Twoja aplikacja może „sprawdzać dostępność aktualizacji” podczas uruchamiania, bez zatrzymywania się.
- LazAutoUpdate jest skierowany do programistów Lazarusa dla Windows i Linux, którzy hostują swój projekt w serwisach SourceForge lub GitHub.
- Upuść komponent, ustaw kilka właściwości (nazwę projektu SourceForge lub niektóre właściwości GitHub) i wywołaj jedną prostą metodę:
- LazAutoUpdate.AutoUpdate
- Ty (programista) masz dużą kontrolę nad zachowaniem komponentu, ale jest on prosty w użyciu.
- Użytkownicy końcowi postrzegają proces aktualizacji jako prosty i przejrzysty.
- Komponent ten został opracowany i przetestowany w systemach Windows 10 64/32-bitowym i Linux 64/32-bitowym.
Pobieranie
- Instalator pakietu LazAutoUpdate (Windows) lub zip (Linux) można pobrać ze strony projektu na SourceForge
- Lazarus OnlinePackager również zawiera pakiet LazAutoUpdate
Instalacja
- Pobierz plik instalacyjny systemu Windows lub pliki binarne zip
- Windows: Zainstaluj, Linux: Rozpakuj w zapasowym folderze
- Użyj pakietu UpdatePack, aby tworzyć i rozpowszechniać pliki aktualizacji
- Użyj komponentu LazAutoUpdate, aby dodać funkcję aktualizacji do swojej aplikacji Lazarus
- Będziesz musiał rozesłać updatehm<os>(.exe) ze swoją aplikacją, aby LazAutoUpdate działał poprawnie
- Nie zapomnij ustawić numerów VersionInfo w opcjach projektu Lazarus
Przykładowa aplikacja
- W pakiecie do pobrania znajduje się projekt 'TestApp'
- Skompiluj i uruchom TestApp (pamiętając o skompilowaniu i skopiowaniu odpowiedniego aktualizatora konsoli (updatehm_xxx) do folderu wykonywalnego)
- Powinien aktualizować się od razu bez podejmowania dodatkowych czynności
- Sprawdź kod źródłowy TestApp, aby dowiedzieć się, jak wykorzystać pełny potencjał LazAutoUpdate
Umiędzynarodowienie
- i8n: LazAutoUpdate ma folder „locale” ze wszystkimi plikami .po potrzebnymi do tłumaczenia. Językiem podstawowym jest angielski
Użycie
- Ustaw numer wersji swojej aplikacji w Projekt/Opcje projektu.../Informacje o wersji
(Uwaga! Jeśli tego nie zrobisz komponent może wygenerować błąd)
- Upuść komponent na główny formularz aplikacji
- Ustaw właściwość SFProjectName na nazwę projektu SourceForge (ten sam tekst, który pojawia się w adresie URL strony projektu)
- lub... Ustaw właściwości GitHub:
- Nazwa projektu GitHub: nazwa użytkownika lub organizacja
- GitHubRepositoryName: Twój projekt/repozytorium
- GitHubBranchOrTag: „master” dla nazwy katalogu głównego lub gałęzi GitHub „lub” Nazwa tagu
- W obu przypadkach ustaw folder UpdatesFolder na lokalizację plików aktualizacji (możesz pozostawić go pustym)
- Użyj pakietu UpdatePack, aby przesłać swoją aplikację do Internetu (SourceForge, GitHub itp.)
- Następnie pozwól komponentowi zająć się szczegółami. Po prostu użyj go (np. jako pozycji menu Pomoc „Sprawdź aktualizacje”)
LazAutoUpdate1.AutoUpdate;
- Jeśli nie chcesz, aby użytkownik zamknął aplikację w trakcie aktualizacji! Użyj tego kodu w obsłudze Form.CloseQuery:
If LazAutoUpdate1.DownloadInProgress Then
Begin
CanClose := False;
ShowMessage('Proszę czekać. Pobieranie aktualizacji nadal jest w toku.');
End;
- Po aktualizacji Twoja aplikacja może automatycznie wyświetlać „Co nowego”. Umieść tę linię w wydarzeniu OnShow swojego formularza:
LazAutoUpdate1.ShowWhatsNewIfAvailable;
- W ten sposób otrzymujesz szkielet kodu aktualizacji dla Twojej aplikacji. Jak widać, wszystko jest całkiem automatyczne i proste.
Większa kontrola
- Zdecyduj, czy chcesz, aby Twoja aplikacja sprawdzała dostępność aktualizacji podczas uruchamiania. Jeśli tak, to podczas aktywacji w swoim formularzu umieść następujący kod:
If LazAutoUpdate1.NewVersionAvailable Then
MessageDlg(Application.Title, 'Dostępna jest nowa wersja ' + Application.Title + LineEnding +
'Kliknij ''Sprawdź nową wersję'' w menu Pomoc aby ją zaktualizować', mtConfirmation,
[mbOK], 0);
- Jeśli nie korzystasz z metody AutoUpdate, masz kontrolę nad procesem aktualizacji etapami za pomocą funkcji:
If LazAutoUpdate1.NewVersionAvailable then ..... else ...
If LazAutoUpdate1.DownloadNewVersion then ..... else ...
If LazAutoUpdate1.UpdateToNewVersion then ..... else ...
Debugowanie
- Jeśli ustawisz
LazAutoUpdate1.DebugMode:=TRUE;
wówczas możesz użyć wbudowanej metody OnDebugEvent do rejestrowania aktywności:
procedure TForm1.LazAutoUpdate1DebugEvent(Sender: TObject; lauMethodName,
lauMessage: string);
begin
// Użyj TEventLog
Logger.Info('('+lauMethodName+') - ' + lauMessage);
end;
Są tu też dostępne zdarzenia: OnDownloaded i OnNewVersionAvailable oraz właściwość LastError z informacjami, które można wykorzystać do debugowania.
Wsparcie
- LazAutoUpdate jest obsługiwane przez forum Lazarus w tym wątku.
Licencja
- LazaAutoUpdate: LGPLv2 (tak samo jak komponenty Lazarusa)
- Pakiet aktualizacji: GPLv2
Wdrażanie aplikacji za pomocą LazAutoUpdate
- Użyj UpdatePack do zarządzania procesem.
- UpdatePack to aplikacja z graficznym interfejsem użytkownika, która umożliwia dokładne i szybkie aktualizowanie plików aktualizacji, a nawet zapewnia odpowiedni kod LazAutoUpdate dla Twojej aplikacji.
- Wykorzystuje ona „profile”, które umożliwiają wdrażanie przyszłych aktualizacji, po prostu aktualizując numer wersji i klikając „Utwórz pakiet aktualizacji”.
- Użytkownicy Twojej aplikacji skorzystają na tym, że zawsze będzie dostępna najnowsza wersja oprogramowania
- Podczas testowania pamiętaj, że Twoja aplikacja testowa powinna mieć niższy numer wersji niż aplikacja do aktualizacji przechowywana online :)
- Jeżeli chcesz samodzielnie skomponować (lub dodać) plik zip aktualizacji, powinien on zawierać co najmniej aplikację i plik tekstowy 'whatsnew.txt'.
Korzystanie z auOtherSourceFilename i auOtherSourceURL
- Gdy ProjectType jest ustawiony na auOther, LazAutoUpdate użyje tych właściwości dla wszystkich metod. Zobacz przykładową aplikację w archiwum SVN.
Aplikacja LazAutoUpdate w zasobniku systemowym tray
- Można ją znaleźć w folderze /trayicon kodu źródłowego.
- Po uruchomieniu znajduje się ona w obszarze zasobnika systemowego (tray) i po cichu sprawdza dostępność aktualizacji za pomocą harmonogramu (konfigurowalne przez programistę i użytkownika)
- Jeśli znajdzie nową wersję, wyświetli użytkownikowi powiadomienie o konieczności aktualizacji:
- Jeśli aplikacja nie działa, aktualizacja odbywa się po cichu w tle
- Jeśli aplikacja jest uruchomiona, zamyka ją, a następnie wykonuje aktualizację. Aplikacja uruchomi się ponownie
- Jeśli znajdzie nową wersję, wyświetli użytkownikowi powiadomienie o konieczności aktualizacji:
- Systray Updater ma menu dostępne po kliknięciu prawym przyciskiem myszy:
- Konfiguracja:
- Użytkownik może edytować harmonogram – każda aplikacja ma swój „profil”
- Uruchamia się przy starcie (Windows):
- Zasobnik systemowy ładuje się bezgłośnie przy każdym rozruchu systemu Windows
- Konfiguracja:
- Zasobnik systemowy (lautraynotify) automatycznie pobiera wpisy z aplikacji korzystających z LazAutoupdate, więc nigdy nie trzeba jej konfigurować - wystarczy zainstalować raz i zapomnieć.
- Harmonogram jest elastyczny, może uruchamiać proces raz dziennie do raz w miesiącu
- UpdatePack zajmuje się tworzeniem pliku konfiguracyjnego zasobnika systemowego dla Twojej aplikacji. Domyślnie sprawdzanie odbywa się w każdy poniedziałek o 9 rano.
- Aplikacja na pasku zadań działa zarówno w systemie Windows, jak i Linux — wystarczy ją wdrożyć.
Tworzenie ogólnego instalatora/aktualizatora online
- Po upuszczeniu składnika LazAutoUpdate na formularz, można go używać do wielu aktualizacji, pobierania itp. (patrz „/testinstaller” w źródle pakietu)
- W przypadku zwykłego instalatora/aktualizatora należy ustawić:
- VersionsINIFilename
- ZipFilename
- AppFileWithPath
- AppVersion
- Ustawiając te właściwości dynamicznie (być może za pomocą menu), możesz umożliwić użytkownikowi aktualizowanie wielu aplikacji hostowanych na witrynie projektu SourceForge/GitHub (lub dowolnej witrynie korzystającej z ustawień auOther - patrz wyżej)
- Oto przykładowy kod do użycia LazAutoUpdate do pobrania, a następnie uruchomienia aplikacji.
- Skompresowane pliki aplikacji (w tym 'whatsnew.txt') i plik 'mywizzyapp.ini' znajdują się w podkatalogu /updates projektu SourceForge 'mywizzy'
- Plik wykonywalny 'updatehm(ostype)(.exe)' znajduje się w tym samym katalogu co aplikacja aktualizacyjna
- ostype=[win32|win64|linux32|linux64]
- Windows ext=(.exe)
- Użytkownik pobierałby mały instalator InnoSetup za pomocą samego instalatora/aktualizatora online, który z kolei pobierałby aplikacje i pliki pomocnicze.
- Oczywiście „instalator” może być twoją główną aplikacją, z aplikacjami siostrzanymi, które można zainstalować za pomocą menu lub czymś podobnym.
procedure TForm1.Button1Click(Sender: TObject);
// Uses SysUtils,LazFileUtils,ulazautoupdate itp.
Var sDirectoryToInstallTo: string;
begin
sDirectoryToInstallTo := ProgramDirectory + 'installed';
Application.Title:='My whizzy app'
LazAutoUpdate1.WorkingMode := lauInstall;
LazAutoUpdate1.ProjectType := auSourceForge;
LazAutoUpdate1.SFProjectname:='mywizzy';
LazAutoUpdate1.VersionsININame:='mywizzyapp.ini';
LazAutoUpdate1.ZipfileName:='mywizzyapp.zip';
LazAutoUpdate1.AppFileWithPath := sDirectoryToInstallTo + DirectorySeparator + 'mywizzyapp.exe';
// Odpowiada za stworzenie folderu
if not DirectoryExistsUTF8(sDirectoryToInstallTo) then ForceDirectoriesUTF8(sDirectoryToInstallTo);
LazAutoUpdate1.Appversion:='0.0.0.0';
If LazAutoUpdate1.DownloadNewVersion then
begin
If LazAutoUpdate1.UpdateToNewVersion then
begin
LazAutoUpdate1.ShortCut.Category := scUtility;
LazAutoUpdate1.ShortCut.Target := LazAutoUpdate1.AppFileWithPath;
LazAutoUpdate1.ShortCut.ShortcutName := Application.Title;
LazAutoUpdate1.MakeShortCut; // tworzy skrót na pulpicie i wpis w menu Start w systemie Windows
end;
end;
end;
- Następnie możesz łatwo programowo uruchomić zainstalowaną aplikację:
// Uses asyncprocess
procedure TForm1.RunInstalledApp;
var
AProcess: TAsyncProcess;
begin
if not FileExistsUTF8(LazAutoUpdate1.AppFileWithPath) then
begin
ShowMessageFmt('Aplikacja %s nie istnieje! Najpierw ją zainstaluj.',
[LazAutoUpdate1.AppFileWithPath]);
Exit;
end;
AProcess := TAsyncProcess.Create(nil);
try
AProcess.Executable := LazAutoUpdate1.AppFileWithPath;
AProcess.Execute;
finally
Aprocess.Free;
end;
end;
Lista metod publicznych
- Function NewVersionAvailable: Boolean;
- Function DownloadNewVersion: Boolean;
- Function UpdateToNewVersion: Boolean;
- Procedure ShowWhatsNewIfAvailable;
- Procedure AutoUpdate;
- function AppIsActive;
- procedure ResetAppVersion;
Lista właściwości niepublikowanych
- GUIOnlineVersion: String;
- ReturnCode: Integer;
- DownloadInprogress: Boolean;
- AppFileWithPath: String;
- AppVersion: String;
- LastError: String;
- DebugMode: Boolean;
- LCLVersion: String;
- WidgetSet: String;
- FPCVersion: String;
- LastCompiled: String;
- TargetOS: String;
- WindowsAdminCheck: Boolean;
Wdrażanie wielu aktualizacji w jednym projekcie
- Domyślnie nazwa pliku ZipFilename jest taka sama jak w Twojej aplikacji, ale możesz ustawić jej unikalną wartość i wdrożyć ją w swoim katalogu plików/aktualizacji online
- Każda aplikacja, która ma zostać zaktualizowana, powinna mieć unikalną nazwę pliku version.ini. Ustaw właściwość VersionsINIFilename.
W przypadku, gdy pobieranie trwa zbyt długo
- Właściwość VersionCountLimit określa, jak długo LazAutoUpdate będzie sprawdzać dostępność nowej wersji przed przekroczeniem limitu czasu.
- Właściwość DownloadCountLimit określa, jak długo LazAutoUpdate będzie próbował pobrać nową wersję przed przekroczeniem limitu czasu.
Versions.ini
Format jest następujący:
;LazAutoUpdate versions file [versions] GUI=0.0.2
- Ten plik jest mały, dzięki czemu można go bardzo szybko pobrać
Kod źródłowy i najnowsze wersje
Bezpieczeństwo
Windows 10
- Zabezpieczenia systemu Windows 10 nie pozwolą użytkownikom niebędącym administratorami na aktualizowanie aplikacji z Internetu (chyba że jest to aplikacja Windows Store). Moim zdaniem jest to rozsądna polityka i LazAutoUpdate się do niej stosuje.
- Jeśli „zwykły użytkownik” spróbuje zaktualizować aplikację za pomocą LazAutoUpdate, wszystko pójdzie gładko aż do ostatniej fazy „Aktualizuj aplikację”. W tym momencie LazAutoUpdate wyświetli okno dialogowe informujące użytkownika, że do rzeczywistej aktualizacji potrzebne jest konto administratora.
- W przypadku „użytkownika administratora” LazAutoUpdate wyświetli okno dialogowe UAC (takie samo jak w przypadku każdego instalatora) i przejdzie dalej po kliknięciu „tak”, aby wykonać aktualizację.
- Jeśli chcesz to obejść (na przykład za pomocą manifestu), LazAutoUpdate ma właściwość publiczną „WindowsAdminCheck”, którą możesz ustawić na FALSE i uniknąć okna dialogowego.
Linux
- Linux wykona aktualizację bez pokazywania konsoli aktualizacji, a użytkownik otrzymuje bezproblemową obsługę.
Przepływ pracy
(Wyjaśnienia techniczne)
Przepływ pracy Lazarus Auto-Updater do aktualizacji uruchomionej aplikacji wygląda następująco:
- Aplikacja pobiera mały plik 'version.ini' z Sourceforge lub github z informacją o wersji (może to zrobić przy starcie)
- Aplikacja porównuje się z własną wersją wewnętrzną
- Jeśli dostępna jest nowa wersja
- Aplikacja usuwa zawartość lokalnego folderu /updates
- Pobiera aplikację, a następnie rozpakowuje ją z Internetu do lokalnego folderu /updates
- Aplikacja używa TAsyncProcess do uruchomienia konsoli updater.exe, przekazując mu w wierszu poleceń nazwę pliku do aktualizacji
- updater.exe kopiuje pobrany plik 'whatsnew.txt' do folderu aplikacji i przechodzi w stan uśpienia na kilka sekund
- W międzyczasie aplikacja wchodzi w pętlę sprawdzania, czy plik 'whatsnew.txt' został skopiowany do tego katalogu
- Aplikacja wykrywa 'whatsnew.txt' i zamyka się. (innymi słowy TProcess rozpoczął się pomyślnie)
- Aktualizator kopiuje /updates/UpdatedApp do katalogu aplikacji.
- Updater używa TProcess do uruchomienia zaktualizowanej aplikacji
- W Form.Show aplikacja wyświetla plik 'whatsnew.txt', a następnie go usuwa
To co widzi użytkownik:
- Okno dialogowe: 'There's a new version of xxx available. Would you like to download it?' Yes/No ('Dostępna jest nowa wersja xxx. Czy chcesz go pobrać?' Tak/Nie)
- Jeśli kliknięto Tak:
- Pobieranie odbywa się w tle (poprzez wątek w tle). Opcjonalnie wyświetlany jest „licznik pobierania” w celu wskazania postępu.
- Użytkownik nie może zamknąć aplikacji podczas pobierania (w Form.CloseQuery)
- Okno dialogowe: 'The update is downloaded. Click OK to install it and restart xxx now' OK („Aktualizacja została pobrana. Kliknij OK, aby teraz zainstalować i zrestartować xxx' OK)
- Użytkownik klika OK
- Konsola (okno DOS w systemie Windows) otworzy się automatycznie, a aplikacja zostanie zamknięta. Konsola wyświetla komunikat 'Please wait updating xxx' („Proszę czekać, trwa aktualizacja xxx”)
- Po kilku sekundach konsola znika i uruchamia się nowa wersja aplikacji
- Zaraz po wyświetleniu głównego okna pojawia się okno informacyjne 'What's New' („Co nowego”) z przyciskiem OK
- Użytkownik klika przycisk OK i nigdy więcej nie widzi informacji