MSI 项目的 NewSetupVersion






3.64/5 (8投票s)
自动递增 MSI 安装项目的版本号。
引言
Visual Studio 支持“安装项目”,例如,从解决方案的输出创建 MSI 安装包。要更新现有安装包,而不先卸载以前的版本,需要在安装项目中手动更改一些属性。本文介绍了一个自动执行此操作的小脚本。
正则表达式用于查找要修改的项目并进行替换。因此,本文也可以被认为是 VBScript 中正则表达式的一个小示例。
背景
如果 MSI 包以前安装在电脑上,并且需要更新此包,则安装程序会提示软件版本已安装,必须先将其删除。
VS 安装项目具有“RemovePreviousVersions
”属性,但仅将其设置为 True
无济于事。还需要更改版本号和产品代码。这是一个手动过程,可以使用一个小脚本在 PreBuildEvent
中自动完成。
使用代码
该脚本是用 VBScript 编写的,非常简单。任务是
- 读取命令行中传递的项目文件,例如,Setup.vdproj
- 备份原始文件,以防出现问题 ;-)
- 查找版本号
- 递增版本号
- 将版本号替换为新值
- 将产品代码替换为新的 GUID
- 将包代码替换为新的 GUID
- 将更新后的项目文件写回磁盘
正则表达式用于查找要修改的项目并进行替换。Execute
方法查找当前版本号条目。它可以从结果的 Matches
集合中提取。版本号有三个部分,用“.”作为分隔符分隔。就我而言,我只是递增版本号的最后一部分。
RegExp
对象有一个 Replace
方法来查找和修改某些内容。
有趣的是,看看如何在 VBScript 中创建新的 GUID
guid = CreateObject("Scriptlet.TypeLib").Guid
guid = left(guid, len(guid) - 2)
我还没有弄清楚为什么 GUID 有一个尾随的两个字节的垃圾,但删除它会有帮助。
这是完整的脚本
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'' Increment the version number of an MSI setup project
'' and update relevant GUIDs
''
'' Hans-Jürgen Schmidt / 19.12.2007
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
set a = wscript.arguments
if a.count = 0 then wscript.quit 1
'read and backup project file
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(a(0))
s = f.ReadAll
f.Close
fbak = a(0) & ".bak"
if fso.fileexists(fbak) then fso.deletefile fbak
fso.movefile a(0), fbak
'find, increment and replace version number
set re = new regexp
re.global = true
re.pattern = "(""ProductVersion"" = ""8:)(\d+(\.\d+)+)"""
set m = re.execute(s)
v = m(0).submatches(1)
v1 = split(v, ".")
v1(ubound(v1)) = v1(ubound(v1)) + 1
vnew = join(v1, ".")
'msgbox v & " --> " & vnew
s = re.replace(s, "$1" & vnew & """")
'replace ProductCode
re.pattern = "(""ProductCode"" = ""8:)(\{.+\})"""
guid = CreateObject("Scriptlet.TypeLib").Guid
guid = left(guid, len(guid) - 2)
s = re.replace(s, "$1" & guid & """")
'replace PackageCode
re.pattern = "(""PackageCode"" = ""8:)(\{.+\})"""
guid = CreateObject("Scriptlet.TypeLib").Guid
guid = left(guid, len(guid) - 2)
s = re.replace(s, "$1" & guid & """")
'write project file
fnew = a(0)
set f = fso.CreateTextfile(fnew, true)
f.write(s)
f.close
很简单,不是吗?(好吧,除了正则表达式。我总是要查找它,因为我不记得语法了......)
要在构建过程中使用脚本,只需将其放入搜索 PATH 中的任何目录即可。将 PreBuildEvent
添加到安装项目,例如
NewSetupVersion.vbs "$(ProjectDir)Setup.vdproj"
结论
上面显示的小 VBScript 对我的 MSI 安装项目很有帮助。也许它对其他人也很有用。
哦,我忘了:我目前正在使用 VS2005。这里使用的关键字可能与其他 VS 版本不同。但由于它只是“脚本”,因此可以适应几乎所有内容...
更新愉快!!!