如何根据我的应用程序版本自动设置我的 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】:正如其他人所提到的,GetFileVersion
或 GetStringFileInfo
预处理器函数可用于此目的。
一些重要信息、改进和有用的补充:
您可以使用 exe 的绝对路径,也可以使用 相对于 .iss 文件的路径 您可以在语句中包含现有定义,只需编写其名称,并使用+
运算符连接定义:#define MyAppPath "..\Win32\Release\" + MyAppExeName
如果您愿意,可以使用函数RemoveFileExt
轻松地从右侧删除部分版本号,例如。 G。将 3.1.2.0 转换为 3.1.2:#define MyAppVersion RemoveFileExt(GetFileVersion(MyAppPath))
您可以在Messages
、Files
或Icons
等后续选项中使用定义MyAppExeName
和MyAppPath
工作示例:
#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 - 如何设置文件夹的完全权限,而不仅仅是它的内容