LazAutoUpdater
From Lazarus wiki
Lazarus Auto-Updater
SourceForge Project
Workflow
The Laz AutoUpdater workflow for updating a running application is as follows:
- App downloads a small 'version.xml' file from sourceforge 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 Sourceforge 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
Version.xml
The format is as follows:
<?xml version="1.0" encoding="utf-8"?> <APPCONFIG> <ProgramInfo> <Version GUI="0.0.2" OtherModule="0.1.0"/> </ProgramInfo> </APPCONFIG>
The code to create it:
uses XMLConf Var XMLConfig1:TXMLConfig; begin XMLConfig1.Clear; XMLConfig1.RootName := 'APPCONFIG'; XMLConfig1.Filename := 'version.xml'; XMLConfig1.OpenKey('ProgramInfo/Version'); XMLConfig1.SetValue('GUI', '0.0.2'); XMLConfig1.SetValue('OtherModule', '0.1.0'); XMLConfig1.CloseKey; XMLConfig1.Flush; end;
The code to read it:
uses XMLConf Var XMLConfig1 :TXMLConfig; szAppVer :String; szOtherMouleVer :String; begin XMLConfig1.Clear; XMLConfig1.RootName := 'APPCONFIG'; XMLConfig1.Filename := 'version.xml'; XMLConfig1.OpenKey('ProgramInfo/Version'); szAppVer:= XMLConfig1.GetValue('GUI', '0.0.0'); // Default is '0.0.0' szOtherMouleVer:= XMLConfig1.GetValue('OtherModule', '0.0.0'); // Default is '0.0.0' XMLConfig1.CloseKey;
Location of files
- In your SourceForge Files section, make a folder called 'updates'
- Upload 'version.xml' into it
- Upload the zip file containing your updated EXE and the file 'whatsnew.txt'
- The application installer (Inno Setup?) goes into your Files section as normal
- The Users should only have to download the installer once. All the subsequent versions will go into the /updates folder as above
Roadmap
- Wrap as much as possible into a single visual component that a developer can drop onto their form, and set properties
- Enable (Console) update.exe to deal with multiple files to update
- Enable (Console) update.exe to deal with updates to subdirectories of the application
- Write full documentation so that the process is as painless as possible for developers
- Make the LazAutoUpdate itself auto-updateable via SourceForge
...work-in-progress