Автоматическое получение версии EXE-файла для встраивания в метаданные установщика NSIS. - PullRequest
7 голосов
/ 19 ноября 2011

Я пытаюсь удалить еще один шаг в процессе выпуска моего приложения, автоматически получая информацию о версиях из моего исполняемого файла (в данном случае, приложения .NET).

До этого момента я был в состояниичтобы обойтись ограниченным знанием NSIS, но я быстро понимаю, что этого недостаточно.

Шаг 1: Объявление информации о версии в исполняемом файле

В AssemblyInfo.CS, я объявляю [assembly: AssemblyVersion("1.0.0.1")].Это успешно приводит к появлению информации о версии в скомпилированном исполняемом файле (в разделе «Версия файла» и «Версия продукта»).

Шаг 2. Получение информации о версии из исполняемого файла

Согласно этой статье о "GetFileVersion" , импорт "FileFunc.nsh" позволяет извлекать информацию о версии из исполняемого файла.

Используемый код:

Section
    Var /GLOBAL version
    ${GetFileVersion} "C:\test.exe" $version
    ...
SectionEnd

Шаг 3. Проверка содержимого вызова функции

На основании раздела 5.1.7 документации я должен быть в состоянии печатать в командной строке во время компиляции, используяКоманда "! echo".Разница между печатью содержимого переменной (или константы и т. Д.) Все еще смущает меня, поэтому я попробовал все четыре из этих опций:

!echo $version
!echo "$version"
!echo "${version}"
!echo ${version}

Это приводит к:

$version (InstallScript.nsi:15)
$version (InstallScript.nsi:16)
${version} (InstallScript.nsi:17)
${version} (InstallScript.nsi:18)

Шаг 4: Объявление метаданных установщика

На основе раздел 4.8.3 , я должен иметь возможность добавлять метаданные установщика через VIProductVersion и VIAddVersionKey.

VIProductVersion $version 
VIAddVersionKey "FileVersion" "$version"

В встроенном установщике это добавляет строку "$ version" в указанные поля.


Есть ли в NSIS эквивалент ToString()?Как я могу получить доступ к содержимому переменной?Означает ли печать имени переменной, что она не имеет содержимого?Как я могу проверить, что GetFileVersion вызывается правильно, выполняется правильно и возвращает значение?

Ответы [ 2 ]

12 голосов
/ 19 ноября 2011

Редактировать: NSIS v3 теперь включает инструкцию препроцессора !getdllversion, обходной путь GetVersionLocal вам нужен, только если вы все еще используете NSIS v2.

Есть планы для! Getdllversion local в NSIS 2.47, сейчас вы должны использовать этот обходной путь:

outfile test.exe
requestexecutionlevel user

!macro GetVersionLocal file basedef
!verbose push
!verbose 1
!tempfile _GetVersionLocal_nsi
!tempfile _GetVersionLocal_exe
!appendfile "${_GetVersionLocal_nsi}" 'Outfile "${_GetVersionLocal_exe}"$\nRequestexecutionlevel user$\n'
!appendfile "${_GetVersionLocal_nsi}" 'Section$\n!define D "$"$\n!define N "${D}\n"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'GetDLLVersion "${file}" $2 $4$\n'
!appendfile "${_GetVersionLocal_nsi}" 'IntOp $1 $2 / 0x00010000$\nIntOp $2 $2 & 0x0000FFFF$\n'
!appendfile "${_GetVersionLocal_nsi}" 'IntOp $3 $4 / 0x00010000$\nIntOp $4 $4 & 0x0000FFFF$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileOpen $0 "${_GetVersionLocal_nsi}" w$\nStrCpy $9 "${N}"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileWrite $0 "!define ${basedef}1 $1$9"$\nFileWrite $0 "!define ${basedef}2 $2$9"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileWrite $0 "!define ${basedef}3 $3$9"$\nFileWrite $0 "!define ${basedef}4 $4$9"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileClose $0$\nSectionend$\n'
!system '"${NSISDIR}\makensis" -NOCD -NOCONFIG "${_GetVersionLocal_nsi}"' = 0
!system '"${_GetVersionLocal_exe}" /S' = 0
!delfile "${_GetVersionLocal_exe}"
!undef _GetVersionLocal_exe
!include "${_GetVersionLocal_nsi}"
!delfile "${_GetVersionLocal_nsi}"
!undef _GetVersionLocal_nsi
!verbose pop
!macroend

!insertmacro GetVersionLocal "$%windir%\Explorer.exe" MyVer_
VIProductVersion "${MyVer_1}.${MyVer_2}.${MyVer_3}.${MyVer_4}"
VIAddVersionKey "FileVersion" "${MyVer_1}.${MyVer_2}.${MyVer_3}.${MyVer_4}"

page instfiles
section
sectionend

Этот макрос:

  1. Создает временный файл .nsi
  2. Компилирует временный .nsi во временный исполняемый файл
  3. Запускает временный .exe
  4. Удаляет два файла (.nsi и .exe)
  5. Возвращает массив, содержащий информацию о версии указанного исполняемого файла.
9 голосов
/ 16 сентября 2013

Обновленная информация:

NSIS теперь включает команду! Getdllversion, которая делает то же самое.Использование:

!getdllversion "$%windir%\explorer.exe" expv_
!echo "Explorer.exe version is ${expv_1}.${expv_2}.${expv_3}.${expv_4}"

ОБНОВЛЕНИЕ : ! Getdllversion Команда «Команда времени компиляции», она отличается от GetDLLVersion инструкция.IMO это должно было быть названо ! Getdllversionlocal во избежание путаницы, поскольку оно похоже на инструкцию GetDLLVersionLocal , а не на GetDLLVersion

У пользователяРуководство, включенное в NSIS 3.0a1, гласит:

5.1.14! getdllversion

localfilename define_basename

Это похоже на GetDLLVersionLocal, только он сохраняет номер версии вопределяет и поэтому может использоваться где угодно, а не только внутри функций и разделов.

!getdllversion "$%windir%\explorer.exe" expv_
!echo "Explorer.exe version is ${expv_1}.${expv_2}.${expv_3}.${expv_4}"
...