Difference between revisions of "LazAutoUpdater/pl"

From Free Pascal wiki
Jump to navigationJump to search
m (→‎Większa kontrola: usunięcie tekstu en)
(Added page template. Deleted English category.)
Line 1: Line 1:
{{LanguageBar}}
+
{{LazAutoUpdater}}
  
 
__TOC__
 
__TOC__
Line 365: Line 365:
 
----
 
----
  
[[Category:Components]]
 
 
[[User:Minesadorada|Minesadorada]]
 
[[User:Minesadorada|Minesadorada]]

Revision as of 22:29, 7 January 2022

English (en) polski (pl) русский (ru)

Streszczenie

  • LazAutoUpdate lazautoupdate.png 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.


lauobjinsp1.jpg lauobjinsp2.jpg


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.


Support

  • LazAutoUpdate is supported via the Lazarus forum here.

License

  • LazaAutoUpdate: LGPLv2 (same as Lazarus components)
  • Update Pack: GPLv2

Deploying your Application with LazAutoUpdate

  • Use UpdatePack to manage the process.
    • UpdatePack is a GUI application that makes the update files accurately and quickly, and even gives you the corresponding LazAutoUpdate code for your app.
    • It uses 'profiles' that enable you to deploy future updates by simply updating the version number and clicking 'Create Update Pack'.
    • Your app users will benefit from having the latest version of your software always available
  • When testing, remember your testing app should be a lower version number than your 'update' app stored online :)
  • If you want to make up (or add to) the update zip yourself, it should contain the App and the text file 'whatsnew.txt' as a minimum.

updatepack1.jpg

updatepack2.jpg


Using auOtherSourceFilename and auOtherSourceURL

  • When ProjectType is set to auOther, LazAutoUpdate will use these properties for all the Methods. See example application in the SVN archive.

LazAutoUpdate Systray Application

  • This can be found in the /trayicon folder of the source.
  • When this is run, it sits in the system tray area and silently checks for updates via a schedule (developer and user configurable)
    • If it finds a new version it pops up a notification to the user to update:
      • If the app not running, the update is done silently in the background
      • If the app is running it closes it and then does the update. The app will then restart
  • Systray updater has a right-click menu:
    • Configure:
      • The user can edit the schedule - each app has a 'profile'
    • Runs at startup (Windows):
      • The systray loads silently at each Windows boot
  • Systray (lautraynotify) picks up entries from apps that use LazAutoupdate automatically, so it never needs to be configured - simply installed once and forgotten.
  • The schedule is flexible, from once every day to once every month
    • The UpdatePack takes care of producing the systray configuration file for your app. The default is to check every Monday at 9am.
  • The systray app works in both Windows and Linux - all you need to do is deploy it.

Making a generic online installer/updater

  • Once a LazAutoUpdate component has been dropped onto a form, it can be used for multiple updates, downloads etc. (see '/testinstaller' in package source)
  • For a generic installer/updater you need to set:
    • VersionsINIFilename
    • ZipFilename
    • AppFileWithPath
    • AppVersion
  • By setting these properties dynamically (perhaps via a menu) you can enable the user to update multiple applications hosted on a SourceForge/GitHub project site (or any site using auOther settings - see above)
  • Here's example code to use LazAutoUpdate to download then run an application.
  • The zipped files for the application (including 'whatsnew.txt') and the file 'mywizzyapp.ini' are located in the /updates subdirectory of the SourceForge project 'mywizzy'
  • The executable 'updatehm(ostype)(.exe)' is in the same directory as your updater app
    • ostype=[win32|win64|linux32|linux64]
    • Windows ext=(.exe)
  • The user would download a small InnoSetup installer with just the online installer/updater, which in turn would download application(s) and supporting files.
    • Of course, the "installer" could be your main application, with sister applications installable via a menu or some such.
procedure TForm1.Button1Click(Sender: TObject);
// Uses SysUtils,LazFileUtils,ulazautoupdate etc..
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';
// Our responsibility to make the folder
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; // makes a desktop shortcut and a Start menu entry in Windows
    end;
  end;
end;
  • You can then programatically run the installed app easily enough:
// Uses asyncprocess
procedure TForm1.RunInstalledApp;
var
  AProcess: TAsyncProcess;
begin
  if not FileExistsUTF8(LazAutoUpdate1.AppFileWithPath) then
  begin
    ShowMessageFmt('%s does not exist! Install it first.',
      [LazAutoUpdate1.AppFileWithPath]);
    Exit;
  end;
  AProcess := TAsyncProcess.Create(nil);
  try
    AProcess.Executable := LazAutoUpdate1.AppFileWithPath;
    AProcess.Execute;
  finally
    Aprocess.Free;
  end;
end;

Public Methods List

  • Function NewVersionAvailable: Boolean;
  • Function DownloadNewVersion: Boolean;
  • Function UpdateToNewVersion: Boolean;
  • Procedure ShowWhatsNewIfAvailable;
  • Procedure AutoUpdate;
  • function AppIsActive
  • procedure ResetAppVersion;

Non-published Properties list

  • 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

Deploying multiple updates in a single project

  • By default, the ZipFilename is the same as your application, but you can set it to a unique value, and deploy it to your Online Files/updates irectory
  • Each application to be updated should have a unique name for the versions.ini file. Set the VersionsINIFilename property.

In case the download takes to long

  • VersionCountLimit property determines how long LazAutoUpdate will check for a new version before timing out.
  • DownloadCountLimit property determines how long LazAutoUpdate will try downloading the new version before timing out.

Versions.ini

The format is as follows:

;LazAutoUpdate versions file
[versions]
GUI=0.0.2
  • The file is small so that it is very quick to download

Source Code and latest versions


Security

Windows 10

  • Windows 10 security will not allow a non-admin user to update applications from the internet (unless it's a Windows Store App). This is a sensible policy in my opinion, and LazAutoUpdate adheres to it.
    • If an 'ordinary user' tries to update an app using LazAutoUpdate, all will go smoothly until the final 'Update app' phase. At that point LazAutoUpdate will pop up a dialog informing the user that an administrator account is needed for the actual update.
    • For an 'admin user', LazAutoUpdate will pop up a UAC dialog (the same as any installer) and proceed upon clicking 'yes' to do the update.
    • If you wish to circumvent this (perhaps with a manifest) LazAutoUpdate has the public property 'WindowsAdminCheck' which you can set to FALSE and avoid the dialog.

Linux

  • Linux will do the update without even showing the update console, and the user gets a seamless experience.

Workflow

(Technical explanation)

The Lazarus Auto-Updater workflow for updating a running application is as follows:

  • App downloads a small 'version.ini' file from sourceforge or github with version info (it can do this at start-up)
  • App compares with its own internal version
  • If new version available
    • App deletes any contents of local /updates folder
    • App downloads then unzips it from the web into a local /updates folder
  • App uses TAsyncProcess to start the console updater.exe, passing it the name of the file to be updated in the command line
  • updater.exe copies a downloaded 'whatsnew.txt' into the App folder and enters Sleep for a few seconds
  • Meanwhile App has entered loop checking whether a 'whatsnew.txt' file has been copied into it's directory
  • App detects 'whatsnew.txt' and Closes. (in other words the TProcess has started successfully)
  • Updater copies /updates/UpdatedApp to App directory.
  • Updater uses TProcess to start the updated app
  • On Form.Show, App displays 'whatsnew.txt' then deletes it

The User sees:

  • Dialog: 'There's a new version of xxx available. Would you like to download it?' Yes/No
  • If Yes clicked:
    • Download happens in the background (via a background thread) Optional 'download counter' is shown to indicate progress.
    • User is prevented from closing the app whilst the download is in progress (in Form.CloseQuery)
    • Dialog: 'The update is downloaded. Click OK to install it and restart xxx now' OK
    • User clicks OK
    • A console (DOS window in Windows) opens automatically and the Application closes. The console says 'Please wait updating xxx'
    • After a couple of seconds the console disappears, and the new version of the App starts
    • As soon as the main window is shown, a 'What's New' info box is shown with an OK button
    • User clicks OK button, and never sees the info again

Minesadorada