2011-07-28 43 views
4

代码从NSI脚本片段:为什么VIProductVersion参数会覆盖ProductVersion键的值?

VIProductVersion 1.2.0.0 
VIAddVersionKey /LANG=${LANG_ENGLISH} FileVersion 1.1.0.0 

我想设置文件版本1.1.0.0但在文件属性设置为1.2.0.0。我也注意到VIProductVersion自己执行加了FileVersion键并设置它的值。

文档说VIProductVersion添加产品版本但我看到的是,文件版本实际上添加。这是NSIS中的错误吗? VIAddVersionKey FileVersion的目的是什么,如果它设置的值被覆盖VIProductVersion设置的值?

VIAddVersionKey要求VIProductVersion调用,否则脚本不会编译。

我使用的版本:EclipseNSIS 0.9.8; MakeNSIS 2.46。操作系统:Windows 7

回答

4

版本信息资源存储在两个部分:

  • VS_FIXEDFILEINFO是产品和文件版本的固定块,VIProductVersion设置此
  • 零,一个或多个(多国语言)带有一个或多个name = value字符串的字符串块,VIAddVersionKey设置这些字符串块。

有些应用程序使用的文件版本字符串,并回落到VS_FIXEDFILEINFO :: dwFileVersion如果字符串不存在,其他应用程序只能使用VS_FIXEDFILEINFO :: dwFileVersion等

VIProductVersion "1.2.3.4"会生成一个版本头,看起来像

1 VERSIONINFO 
FILEVERSION 1,2,3,4 
PRODUCTVERSION 1,2,3,4 
FILEOS 0x4 
FILETYPE 0x1 

这通常足够,但它不会让您设置PRODUCTVERSION!= FILEVERSION。

我认为这是NSIS中的一个错误,他们应该添加VIFileVersion命令或将VIProductVersion扩展为VIProductVersion <productver> [filever]

您可以在tracker上添加功能请求。

与此同时,你可能能够解决此通过构建与packhdr过程中调用 resource hacker


编辑:

它可以与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 
} 
} 
+0

谢谢你的回答,它真的帮助我了解'VIProductVersion'的工作原理。它的确应该按照你的建议进行扩展,或者至少应该在NSIS文档中增加一条评论。 –

+0

VIFileVersion现已添加到SVN ... – Anders

1

我想我会提到这个bug的显而易见的解决方法。

当使用NSIS 2.46设置VIProductVersion文件版本然后用VIAddVersionKey设置的ProductVersion,你还需要设置FILEVERSION避免NSIS编译器警告。

VIProductVersion ${INSTALLER_VERSION} 
VIAddVersionKey ProductName ${PROGRAM_NAME} 
VIAddVersionKey FileVersion ${INSTALLER_VERSION} 
VIAddVersionKey ProductVersion ${PROGRAM_VERSION} 
... 
相关问题