How do I automatically set the version of my Inno Setup installer according to my application version?

Viewed 26747

I am using Inno Setup to generate the installer of my application. How can set the version number of the setup.exe (VersionInfoVersion) generated by Inno to match with the version number of my application automatically? Now every time I deploy a new version of my application I need to update the version number manually.

Now I'm doing this:

[Setup]
VersionInfoVersion=1.2.2.0 //writing the value manually

I want something like this:

[Setup]
VersionInfoVersion={Get the version of my app}
7 Answers

As others have mentioned, the GetFileVersion or GetStringFileInfo preprocessor functions can be used for that.

Some important info, improvements and helpful additions:

  • You can either use an absolute path to the exe, or a path relative to the .iss file
  • You can include existing defines in your statement by just writing their name, and concatenate defines with the + operator:
    #define MyAppPath "..\Win32\Release\" + MyAppExeName
  • If you want you can easily remove parts of the version number from the right by using the function RemoveFileExt, e. g. convert 3.1.2.0 to 3.1.2:
    #define MyAppVersion RemoveFileExt(GetFileVersion(MyAppPath))
  • You can use the defines MyAppExeName and MyAppPath in the subsequent options like Messages, Files or Icons

Working example:

#define MyAppName "Application Name"
#define MyAppExeName "Application.exe"        
#define MyAppPath "..\Win32\Release\" + MyAppExeName
#define MyAppVersion RemoveFileExt(GetFileVersion(MyAppPath))

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName={#MyAppName} {#MyAppVersion}
VersionInfoVersion={#MyAppVersion}
OutputBaseFilename={#MyAppName}-{#MyAppVersion}-Windows

...

[Messages]
SetupWindowTitle=Setup - {#MyAppName} {#MyAppVersion}

...

[Files]
Source: {#MyAppPath}; DestDir: "{app}"; Flags: ignoreversion; Tasks: desktopicon

...

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"

In my case, I would like to define the version string from a file. I don't have an EXE, since my installer is packing an embedded Python program. So I define the version number in a one-line text file like such (this is created from a git tag statement beforehand):

..\Build\app_version.txt:
v1.2.1

In the Inno Setup, I used a pre-processor define statement to set the version throughout the text.

#define VerFileNum FileOpen("..\Build\app_version.txt")
#define MyAppVersion Trim(StringChange(FileRead(VerFileNum),"v",""))

Here, I used Trim() and StringChange() to remove the leading "v" and trailing spaces from the string. Later in the setup section, the AppVersion value can be set using the pre-processor definition:

[Setup]
AppVersion={#MyAppVersion}

The Inno Setup pre-processor has quite an extensive set of functions already defined: Inno setup pre-processor functions

After quite some time trying other methods, the way it worked for me was to use a relative path (I have the .iss file in a folder and the EXE file two levels above).

; Extract File Version from EXE
#define MyAppVersion GetFileVersion("..\..\Release\CSClave.exe")
Related