Почему аргумент VIProductVersion переопределяет значение ключа ProductVersion? - PullRequest
4 голосов
/ 28 июля 2011

Фрагмент кода из скрипта 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 и устанавливает его значение.

Документация говорит, что VIProductVersion добавляет Версия продукта , но я вижу, что FileVersion фактически добавлено. Это ошибка в NSIS? Какова цель VIAddVersionKey FileVersion, если значение, которое оно устанавливает, переопределяется с одним, установленным VIProductVersion?

VIAddVersionKey требует VIProductVersion вызова, скрипт не компилируется иначе.

Версии, которые я использую: EclipseNSIS 0.9.8; MakeNSIS 2.46. ОС: Windows 7.

Ответы [ 2 ]

4 голосов
/ 28 июля 2011

Ресурс информации о версии хранится в двух частях:

  • VS_FIXEDFILEINFO - это фиксированный блок с версиями продукта и файла, VIProductVersion устанавливает это
  • Ноль,один или несколько (несколько языков) строковых блоков с одной или несколькими строками name = value, VIAddVersionKey устанавливает их.

Некоторые приложения используют строку FileVersion и возвращаются к 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 .

Тем временем вы можете обойти это, вызвав resource hacker во время сборки.d с! packhdr


Редактировать:

Это можно сделать с помощью 2.46 во время компиляции с! packhdr, внешними сторонними инструментами (мне не удалось получить rehacker для импортаресурс версии .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
}
}
2 голосов
/ 10 сентября 2015

Я подумал, что упомяну очевидный обходной путь для этой ошибки.

При использовании NSIS 2.46 установите VIProductVersion на FileVersion , а затем VIAddVersionKey установить ProductVersion , вам также потребуется установить Fileversion , чтобы избежать предупреждения компилятора NSIS.

VIProductVersion ${INSTALLER_VERSION}
VIAddVersionKey ProductName ${PROGRAM_NAME}
VIAddVersionKey FileVersion ${INSTALLER_VERSION}
VIAddVersionKey ProductVersion ${PROGRAM_VERSION}
...
...