Salvador
Salvador

Reputation: 16482

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

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}

Upvotes: 75

Views: 32740

Answers (8)

Moha Krs
Moha Krs

Reputation: 41

For my fellow "Flutterers", I had the issue that

GetFileVersion

returns the file version, which consists of three digits 1.0.0.0 for example, and I wanted to get the build version 1.0.0 .

A work around for this is to define a User Defined Function, which discards the las digit, here is the result:

#define DeleteLastDigitFromVersion(version) Local[1] = Copy(version, 1, (Local[0] = RPos(".", version)) - 1), version = Local[1]
#define ApplicationVersion DeleteLastDigitFromVersion(GetFileVersion('YourExe.exe'))

You can then set the defined value in your outputBaseFileName for example:

OutputBaseFilename=app_name_windows_x64_{#ApplicationVersion}

Upvotes: 0

RexBarker
RexBarker

Reputation: 1801

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

Upvotes: 2

RRUZ
RRUZ

Reputation: 136441

You can use the Inno Setup Preprocessor GetVersionNumbersString function like this

#define ApplicationName 'Application Name'
#define ApplicationVersion GetVersionNumbersString('Application.exe')
[Setup]
AppName={#ApplicationName}
AppVerName={#ApplicationName} {#ApplicationVersion}
VersionInfoVersion={#ApplicationVersion}

Upvotes: 115

Flo
Flo

Reputation: 219

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}"

Upvotes: 4

cdsaenz
cdsaenz

Reputation: 550

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")

Upvotes: 1

Malick
Malick

Reputation: 6742

Another way to do it by using a command line argument :

[Setup]           
AppVersion={#MyAppVersion}

and you just call your script as follow from a cmd :

cd C:\Program Files (x86)\Inno Setup 5

iscc /dMyAppVersion="10.0.0.1" "C:\MyPath\MyScript.iss"

It emulate #define MyAppVersion="10.0.0.1" in the iss script.


If you are using CakeBuild, you can pass this argument as

 string CurrentVersion  = "10.0.0.1";
 InnoSetupSettings settings = new InnoSetupSettings();
 settings.Defines=   new Dictionary<string, string>
            {
            { "MyAppVersion", CurrentVersion },
            };
   InnoSetup("C:\MyPath\MyScript.iss", settings);

Upvotes: 18

JanRK
JanRK

Reputation: 167

I had some problems with getting this to work, so just contributing my solution.

app.iss:

[Setup]
#include "Config.txt"

#define AppVersion GetFileVersion("Input\" + AppExec)


AppName={#AppName}
AppVersion={#AppVersion}

Config.txt:

#define AppName "App"
#define AppExec "App.exe"

Upvotes: 5

Jens A. Koch
Jens A. Koch

Reputation: 41786

In case you have a pure webinstaller, the accepted solution won't work, because you simply won't have an application.exe to get the version number from.

I'm using Nant and a build.xml file with version number properties, which i manually bump, before i'm rebuilding the innosetup installers.

My *.iss files contain a special token @APPVERSION@, which is replaced with the version number during the build process. This is done via a copy operation with an applied filterchain, see below.

InnoSetup Script (*.iss)

// the -APPVERSION- token is replaced during the nant build process
#define AppVersion "@APPVERSION@"

nant build.xml:

<!-- Version -->
<property name="product.Name"           value="My Software"/>
<property name="version.Major"          value="1"/>
<property name="version.Minor"          value="2"/>
<property name="version.BuildNumber"    value="3"/>
<property name="product.Version" 
          value="${version.Major}.${version.Minor}.${version.BuildNumber}"/>

<!-- build task -->
<target name="bump-version"
        description="Inserts the current version number into the InnoScript.">
        <copy todir="${dir.Build}" overwrite="true">
            <fileset basedir="${dir.Base}/innosetup/">
                <include name="product-webinstaller-w32.iss"/>
                <include name="product-webinstaller-w64.iss"/>
            </fileset>
            <filterchain>
                <replacetokens>
                    <token key="APPVERSION" value="${product.Version}"/>
                </replacetokens>
            </filterchain>
        </copy>
</target>

Upvotes: 6

Related Questions