Difference between revisions of "LazAutoUpdater"

From Free Pascal wiki
Jump to navigationJump to search
m (Added download link)
(Added update for newer versions of fpc (3.x))
Line 20: Line 20:
 
*LazAutoUpdate source code and compiled applications can be downloaded from the [http://sourceforge.net/projects/lazautoupdate/ SourceForge project site]
 
*LazAutoUpdate source code and compiled applications can be downloaded from the [http://sourceforge.net/projects/lazautoupdate/ SourceForge project site]
 
*The installers are for Windows 32-bit and Linux 64-bit
 
*The installers are for Windows 32-bit and Linux 64-bit
 +
<br>
 +
----
 +
===Update Nov 2016===
 +
* For newer fpc/Lazarus installations (fpc 3.x) download the newer pas file [https://sourceforge.net/projects/lazautoupdate/files/lazautoupdatesource/ulazautoupdate.pas/download ulasautoupdate.pas] to replace the standard one.
 
<br>
 
<br>
 
----
 
----

Revision as of 10:49, 2 November 2016

Lazarus Auto-Updater

Summary

  • LazAutoUpdater is a visual drop-in component for the Lazarus/FPC IDE to make updating your application easier and simpler.
  • It is aimed at Lazarus Windows and Linux developers who host their project in SourceForge.
  • Drop-in the component, set one property (your sourceforge project name) and call these simple methods:
    • If LazAutoUpdate.NewVersionAvailable then...
    • LazAutoUpdate.DownloadNewVersion
    • LazAutoUpdate.UpdateToNewVersion

..and in your form.activate code:

    • LazAutoUpdate.ShowWhatsNewIfAvailable
  • 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 Vista 32-bit and Linux Mint 64-bit


objinsp screenshot.png lazautoupdate 2.png


Download

  • LazAutoUpdate source code and compiled applications can be downloaded from the SourceForge project site
  • The installers are for Windows 32-bit and Linux 64-bit



Update Nov 2016

  • For newer fpc/Lazarus installations (fpc 3.x) download the newer pas file ulasautoupdate.pas to replace the standard one.



Installation

  • Download the package source files from the SourceForge Project site (link below)
  • If not already done, compile the laz_synapse package (no need for installation). It is included in LazAutoUpdater for your convenience.
  • Install the lazautoupate package (it will be in your 'System' tab)
  • Compile updatehm.lpi for your system architecture
    • You will need to distribute updatehm(.exe) with your application for LazAutoUpdate to work correctly



Use

  • 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)
  • 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;
  • (from v0.0.9) Or let the component do all this for you - just use
LazAutoUpdate1.AutoUpdate;
  • 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

  1. Make a folder in your SourceForge project files called 'updates' (from the Files root)
  2. Make a ZIP file containing the latest version of the executable and a 'whatsnew.txt' (which will be shown to the user)
    1. Important: If there is no 'whatsnew.txt' in the Zip then LazAutoUpdate will not work!
    2. If the CopyTree property=true then the zip file can contain folders and their contents, which will be unzipped and copied en masse to the application directory (with folder structure intact)
  3. Upload the ZIP file to the SourceForge /updates folder
  4. Make a 'versions.ini' file with the GUI='n.n.n.n' version number that matches the version number in your updated executable
  5. Upload the versions.ini to your SourceForge /updates folder
  6. In your installer, be sure that it makes a local /updates folder (relative to the installation destination). This is important for permissions in Windows.
  7. In your installer, be sure to include the file 'updatehm.exe'. It should install to the same folder as your application



Deploying subsequent updates

  • Simply repeat items (2-5) in the list above every time you have a new version for your users.
  • A GUI is available on the SourceForge site to create and manage this process:

laupdatepack1.png


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:
    • 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 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 SFProject 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



SourceForge Project



Workflow

(Technical explanation)

The Laz AutoUpdater workflow for updating a running application is as follows:

  • App downloads a small 'version.ini' 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



Minesadorada