如何根据我的应用程序版本自动设置我的 Inno Setup 安装程序的版本?

Posted

技术标签:

【中文标题】如何根据我的应用程序版本自动设置我的 Inno Setup 安装程序的版本?【英文标题】:How do I automatically set the version of my Inno Setup installer according to my application version? 【发布时间】:2011-09-23 20:00:33 【问题描述】:

我正在使用 Inno Setup 来生成我的应用程序的安装程序。如何设置 Inno 生成的 setup.exe (VersionInfoVersion) 的版本号自动匹配我的应用程序的版本号?现在,每次我部署新版本的应用程序时,我都需要手动更新版本号。

现在我正在这样做:

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

我想要这样的东西:

[Setup]
VersionInfoVersion=Get the version of my app

【问题讨论】:

【参考方案1】:

你可以像这样使用 Inno Setup Preprocessor GetVersionNumbersString 函数

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

【讨论】:

哦,看来我需要输入我的 exe 的完整路径......而不仅仅是示例中的 exe 名称。 为什么不能使用#define ApplicationVersion GetFileVersion(#ApplicationName) @NickG:相对路径也足够了 @SAAD:它应该可以工作:#define ApplicationVersion GetFileVersion(ApplicationName) 如果您单独指定了相关文件夹,正确的语法应该是:#define MyAppVersion GetFileVersion(MyAppSourceFolder + '\' + MyAppExeName)。请务必记住,#var 语法在这里似乎不起作用。【参考方案2】:

使用a command line argument 的另一种方法:

[Setup]           
AppVersion=#MyAppVersion

你只需从 cmd 调用你的脚本:

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

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

它在 iss 脚本中模拟 #define MyAppVersion="10.0.0.1"


如果你使用CakeBuild,你可以把这个参数传递为

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

【讨论】:

【参考方案3】:

如果您有一个纯网络安装程序,则接受的解决方案将不起作用, 因为你根本没有 application.exe 来获取版本号。

我正在使用 Nant 和带有版本号属性的 build.xml 文件,在我重建 innosetup 安装程序之前,我手动修改了该文件。

我的 *.iss 文件包含一个特殊标记 @APPVERSION@,它被替换 在构建过程中使用版本号。这是通过应用过滤器链的复制操作完成的,见下文。

InnoSetup 脚本 (*.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>

【讨论】:

【参考方案4】:

我在让它工作时遇到了一些问题,所以只提供我的解决方案。

app.iss:

[Setup]
#include "Config.txt"

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


AppName=#AppName
AppVersion=#AppVersion

Config.txt:

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

【讨论】:

【参考方案5】:

正如其他人所提到的,GetFileVersionGetStringFileInfo 预处理器函数可用于此目的。

一些重要信息、改进和有用的补充:

您可以使用 exe 的绝对路径,也可以使用 相对于 .iss 文件的路径 您可以在语句中包含现有定义,只需编写其名称,并使用+ 运算符连接定义:#define MyAppPath "..\Win32\Release\" + MyAppExeName 如果您愿意,可以使用函数RemoveFileExt 轻松地从右侧删除部分版本号,例如。 G。将 3.1.2.0 转换为 3.1.2:#define MyAppVersion RemoveFileExt(GetFileVersion(MyAppPath)) 您可以在MessagesFilesIcons 等后续选项中使用定义MyAppExeNameMyAppPath

工作示例:

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

【讨论】:

【参考方案6】:

在尝试其他方法相当长的一段时间后,它对我的​​工作方式是使用相对路径(我在文件夹中有 .iss 文件,在上面两层有 EXE 文件)。

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

【讨论】:

【参考方案7】:

就我而言,我想从文件中定义版本字符串。我没有 EXE,因为我的安装程序正在打包一个嵌入式 Python 程序。所以我在这样的单行文本文件中定义版本号(这是事先从git tag 语句创建的):

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

在 Inno Setup 中,我使用预处理器定义语句来设置整个文本的版本。

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

在这里,我使用Trim()StringChange() 从字符串中删除前导“v”和尾随空格。稍后在设置部分,可以使用预处理器定义设置AppVersion 值:

[Setup]
AppVersion=#MyAppVersion

Inno Setup 预处理器已经定义了相当广泛的功能集:Inno setup pre-processor functions

【讨论】:

以上是关于如何根据我的应用程序版本自动设置我的 Inno Setup 安装程序的版本?的主要内容,如果未能解决你的问题,请参考以下文章

Inno-Setup:如何让用户选择是不是自动启动?

Inno Setup 下载安装

Inno Setup - 如何设置文件夹的完全权限,而不仅仅是它的内容

Inno Setup:将预处理器生成的输出文件名返回到批处理脚本

Inno 设置用户主路径

在 inno setup 如何使用产品名称、产品版本和版权属性设置 unins000.exe [重复]