Nsis 为什么VIProductVersion参数会覆盖ProductVersion键的值?
nsi脚本中的代码段:Nsis 为什么VIProductVersion参数会覆盖ProductVersion键的值?,nsis,Nsis,nsi脚本中的代码段: VIProductVersion 1.2.0.0 VIAddVersionKey /LANG=${LANG_ENGLISH} FileVersion 1.1.0.0 我想将FileVersion设置为1.1.0.0,但在文件属性中它设置为1.2.0.0。我还注意到自己执行的VIProductVersion会添加FileVersion键并设置其值 文档说明添加了产品版本,但我看到的是实际上添加了FileVersion。这是NSIS中的错误吗?如果viadVersio
VIProductVersion 1.2.0.0
VIAddVersionKey /LANG=${LANG_ENGLISH} FileVersion 1.1.0.0
我想将FileVersion设置为1.1.0.0
,但在文件属性中它设置为1.2.0.0
。我还注意到自己执行的VIProductVersion
会添加FileVersion键并设置其值
文档说明添加了产品版本,但我看到的是实际上添加了FileVersion。这是NSIS中的错误吗?如果viadVersionKey FileVersion
设置的值被VIProductVersion
的一个设置覆盖,那么它的用途是什么
viadVersionKey
需要调用VIProductVersion
否则脚本不会编译
我正在使用的版本:Eclipsensis0.9.8;马克斯2.46。操作系统:Windows 7。版本信息资源存储在两个部分中:
- 是具有产品和文件版本的固定块,VIProductVersion设置此
- 零个、一个或多个(多种语言)字符串块以及一个或多个名称=值字符串,通过版本键设置这些字符串
VIProductVersion“1.2.3.4”
将生成一个如下所示的版本头
1 VERSIONINFO
FILEVERSION 1,2,3,4
PRODUCTVERSION 1,2,3,4
FILEOS 0x4
FILETYPE 0x1
这通常足够了,但它不允许您设置PRODUCTVERSION!=文件版本
我认为这是NSIS的一个bug,他们应该添加一个VIFILVEVISH命令或将ViueTebug版本扩展到
编辑: 它可以在编译时用2.46完成!packhdr、外部第三方工具(我无法让reshacker导入.rc版本资源,因此我必须先转换为.res)和可怕的黑客行为:
!macro HackyVIFileVersion reshack gorcjorg fixedfilever
;http://www.angusj.com/resourcehacker/
;http://web.archive.org/web/20090918063311/http://www.jorgon.freeserve.co.uk/Gorcjorg.zip
!searchreplace HackyVIFileVersion_id "${__TIME__}" ":" ""
!define HackyVIFileVersion_cmd "$%TEMP%\nsisVIFV${HackyVIFileVersion_id}.cmd"
!appendfile "${HackyVIFileVersion_cmd}" `@echo off&setlocal ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION$\n`
!appendfile "${HackyVIFileVersion_cmd}" `set eh=%TEMP%\exehead%~1.tmp$\n`
!appendfile "${HackyVIFileVersion_cmd}" `set rh=%~2$\n`
!appendfile "${HackyVIFileVersion_cmd}" `call "%rh%" -extract "%eh%", "%eh%1.rc", VersionInfo,1,$\n`
!appendfile "${HackyVIFileVersion_cmd}" `> "%eh%2.rc" echo.LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US $\n` ;must force lang for Gorcjorg
!appendfile "${HackyVIFileVersion_cmd}" `FOR /F "usebackq tokens=* delims=" %%A IN ("%eh%1.rc") DO ($\n`
!appendfile "${HackyVIFileVersion_cmd}" ` FOR /F "usebackq" %%B IN ('%%A') DO ($\n`
!appendfile "${HackyVIFileVersion_cmd}" ` if "%%~B"=="FILEVERSION" (>> "%eh%2.rc" echo.FILEVERSION %~4) else (>> "%eh%2.rc" echo.%%A)$\n`
!appendfile "${HackyVIFileVersion_cmd}" ` )$\n`
!appendfile "${HackyVIFileVersion_cmd}" `)$\n`
!appendfile "${HackyVIFileVersion_cmd}" `call "%~3" /fo "%eh%.res" /r "%eh%2.rc"$\n`
!appendfile "${HackyVIFileVersion_cmd}" `call "%rh%" -addoverwrite "%eh%", "%eh%", "%eh%.res", versioninfo,1,$\n`
!appendfile "${HackyVIFileVersion_cmd}" `del "%eh%2.rc"&del "%eh%1.rc"&del "%eh%.res"&del "%~0"`
!packhdr "$%TEMP%\exehead${HackyVIFileVersion_id}.tmp" '"${HackyVIFileVersion_cmd}" "${HackyVIFileVersion_id}" "${reshack}" "${gorcjorg}" "${fixedfilever}"'
!undef HackyVIFileVersion_cmd
!undef HackyVIFileVersion_id
!macroend
VIProductVersion "1.2.3.4"
VIAddVersionKey /LANG=1033 FileVersion 5.6.7.8
VIAddVersionKey /LANG=1033 ProductVersion "1.2.3.4"
VIAddVersionKey /LANG=1033 Comments "A test comment"
!insertmacro HackyVIFileVersion "C:\tools\ResHacker.exe" "C:\tools\GoRC.exe" "5,6,7,8"
…最终您将获得此版本资源:
1 VERSIONINFO
FILEVERSION 5,6,7,8
PRODUCTVERSION 1,2,3,4
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
BLOCK "040904e4"
{
VALUE "Comments", "A test comment"
VALUE "FileVersion", "5.6.7.8"
VALUE "ProductVersion", "1.2.3.4"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0409 0x04E4
}
}
我想我会提到这个bug的明显解决方法 使用NSIS 2.46时,将VIProductVersion设置为您的FileVersion,然后使用ViadVersionKey设置ProductVersion,您还需要设置FileVersion以避免NSIS编译器警告
VIProductVersion ${INSTALLER_VERSION}
VIAddVersionKey ProductName ${PROGRAM_NAME}
VIAddVersionKey FileVersion ${INSTALLER_VERSION}
VIAddVersionKey ProductVersion ${PROGRAM_VERSION}
...
感谢您的回答,它确实帮助我理解了
VIProductVersion
的工作原理。它应该按照您的建议进行扩展,或者至少在NSIS文档中添加一条注释。