From Free Pascal wiki
- 1 Lazarus Auto-Updater
- 1.1 Summary
- 1.2 Download
- 1.3 Installation
- 1.4 Use
- 1.5 Deploying your Application with LazAutoUpdate
- 1.6 Using auOtherSourceFilename and auOtherSourceURL
- 1.7 Making a generic installer/updater
- 1.8 Public Methods List
- 1.9 Non-published Properties list
- 1.10 Deploying multiple updates in a single project
- 1.11 In case the download takes to long
- 1.12 Versions.ini
- 1.13 Source Code and latest versions
- 1.14 Security
- 1.15 Workflow
- LazAutoUpdater is a visual drop-in component for the Lazarus/FPC IDE to make updating your application easier and smarter.
- LazAutoUpdae downloads via a background thread so the user can continue using your app without interruption
- This means for example, your app can 'check for updates' at startup without the app becoming unresponsive.
- It is aimed at Lazarus Windows and Linux developers who host their project in SourceForge or GitHub.
- Drop-in the component, set one property (your sourceforge project name, ot GitHub properties) and call one simple method:
- You (the developer) have plenty of control over how the component behaves, yet it is simple to use.
- End-users see the updating process as simple and transparent
- Tested and developed in Windows 10 64/32-bit and Linux Mint 64/32-bit
- LazAutoUpdate source code can be downloaded from the SourceForge project site
- The Lazarus OnlinePackager also contains LazAutoUpdate
- Download the Windows setup file or the linuxbinaries zip
- Windows: Install, Linux: Unzip in a spare folder
- Use the UpdatePack to make and distribute your update files
- Use the LazAutoUpdate component to add update functionality to your Lazarus app
- You will need to distribute updatehm<os>(.exe) with your application for LazAutoUpdate to work correctly
- Drop the component onto the main form of your application
- Set the SFProjectName property to your SourceForge project name (the same text as appears in the URL for your project page)
- or.. Set the GitHub properties:
- GitHubProjectname: Username or Organisation
- GitHubRepositoryName: Your project/repository
- GitHubBranchOrTag: 'master' for the root or the GitHub Branch name or Tag name
- In both cases set the UpdatesFolder to the location of your update files (you can leave it blank)
- Then let the component take care of the details. Just use (perhaps as a Help menu item 'Check for updates')
- Decide if you want your app to check for updates on startup. If so, in your form.activate handler:
If LazAutoUpdate1.NewVersionAvailable Then MessageDlg(Application.Title, 'A new version of ' + Application.Title + ' is available.' + LineEnding + 'Click ''Check for new version'' in Help menu to update', mtConfirmation, [mbOK], 0);
- Give the user a chance to update the application. Here's some sample code:
LazAutoUpdate1.SFProjectName := 'lazautoupdate'; If LazAutoUpdate1.NewVersionAvailable Then If LazAutoUpdate1.DownloadNewVersion Then Begin If MessageDlg(Application.Title, 'Download Succeeded. Click OK to update', mtInformation, [mbOK], 0) = 1 Then LazAutoUpdate1.UpdateToNewVersion; End Else ShowMessage('Sorry, download of new version failed') Else ShowMessage('Sorry, no new version is available');
- You don't want the user to close your application in the middle of an update! Use this code in the Form.CloseQuery handler:
If LazAutoUpdate1.DownloadInProgress Then Begin CanClose := False; ShowMessage('Please wait. Download is still progress.'); End;
- This gives you the 'bare bones' of the update code for your application. As you can see, it's all pretty automatic and simple.
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.
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.
Making a generic installer/updater
- Once a LazAutoUpdate component has been dropped onto a form, it can be used for multiple updates, downloads etc.
- For a generic installer/updater you need to set:
- 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.exe' is in the same directory as your updater app
- The user would download a small InnoSetup installer with just the online installer/updater, which in turn would download the main application and supporting files.
procedure TForm1.Button1Click(Sender: TObject); begin Application.Title:='My whizzy app'; LazAutoUpdate1.SFProjectname:='mywizzy'; LazAutoUpdate1.VersionsININame:='mywizzyapp.ini'; LazAutoUpdate1.ZipfileName:='mywizzyapp.zip'; LazAutoUpdate1.AppFileWithPath:='mywizzyapp.exe'; LazAutoUpdate1.Appversion:='0.0.0.0'; If LazAutoUpdate1.DownloadNewVersion then LazAutoUpdate1.UpdateToNewVersion; end;
Public Methods List
- Function NewVersionAvailable: Boolean;
- Function DownloadNewVersion: Boolean;
- Function UpdateToNewVersion: Boolean;
- Procedure ShowWhatsNewIfAvailable;
- Procedure AutoUpdate;
Non-published Properties list
- GUIOnlineVersion: String
- ModuleOnlineVersion: String
- ReturnCode: Integer
- DownloadInprogress: Boolean
- AppFileWithPath: String
- AppVersion: String
- LastError: String;
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.
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
- 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 will do the update without even showing the update console, and the user gets a seamless experience.
The Laz AutoUpdater 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