NSIS - поставить версию EXE в имя установщика - PullRequest
16 голосов
/ 14 июня 2010

NSIS имеет переменную Name, которую вы определяете в скрипте:

Name "MyApp"

Она определяет имя установщика, которое отображается в виде заголовка окна и т. Д.

Есть ли способ извлечь номер версии .NET из моего основного EXE-файла и добавить его к имени?

, чтобы мое имя установщика автоматически получило «MyApp V2.2.0.0» илилюбой

Ответы [ 7 ]

22 голосов
/ 14 июня 2010

Может быть очень простой способ сделать это, но я не знаю, что это такое.Когда я впервые начал использовать NSIS, я разработал этот обходной путь, чтобы удовлетворить свои потребности, и не пересматривал проблему с тех пор, чтобы посмотреть, есть ли что-нибудь более элегантное.

Я хотел, чтобы мои установщики имели тот же номер версии, описание,и информация об авторских правах как мой основной исполняемый файл.Поэтому я написал короткое приложение на C # под названием GetAssemblyInfoForNSIS, которое извлекает информацию о файле из исполняемого файла и записывает ее в файл .nsh, который входит в мои установщики.

Вот приложение C #:

using System;
using System.Collections.Generic;
using System.Text;

namespace GetAssemblyInfoForNSIS {
    class Program {
        /// <summary>
        /// This program is used at compile-time by the NSIS Install Scripts.
        /// It copies the file properties of an assembly and writes that info a
        /// header file that the scripts use to make the installer match the program
        /// </summary>
        static void Main(string[] args) {
            try {
                String inputFile = args[0];
                String outputFile = args[1];
                System.Diagnostics.FileVersionInfo fileInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(inputFile);
                using (System.IO.TextWriter writer = new System.IO.StreamWriter(outputFile, false, Encoding.Default)) {
                    writer.WriteLine("!define VERSION \"" + fileInfo.ProductVersion + "\"");
                    writer.WriteLine("!define DESCRIPTION \"" + fileInfo.FileDescription + "\"");
                    writer.WriteLine("!define COPYRIGHT \"" + fileInfo.LegalCopyright + "\"");
                    writer.Close();
                }
            } catch (Exception e) {
                Console.WriteLine(e.Message + "\n\n");
                Console.WriteLine("Usage: GetAssemblyInfoForNSIS.exe MyApp.exe MyAppVersionInfo.nsh\n");
            }
        }
    }
}

Таким образом, если вы используете это приложение следующим образом:

GetAssemblyInfoForNSIS.exe MyApp.exe MyAppVersionInfo.nsh

Вы получите файл с именем MyAppVersionInfo.nsh, который выглядит примерно так:это (при условии, что эта информация находится в вашем исполняемом файле):

!define VERSION "2.0" 
!define DESCRIPTION "My awesome application"
!define COPYRIGHT "Copyright © Me 2010"

В верхней части моего сценария NSIS я делаю что-то вроде этого:

!define GetAssemblyInfoForNSIS "C:\MyPath\GetAssemblyInfoForNSIS.exe"
!define PrimaryAssembly "C:\MyPath\MyApp.exe"
!define VersionHeader "C:\MyPath\MyAppVersionInfo.nsh"
!system '"${GetAssemblyInfoForNSIS}" "${PrimaryAssembly}" "${VersionHeader}"'
!include /NONFATAL "${VersionHeader}"

!ifdef VERSION
    Name "My App ${VERSION}"
!else
    Name "My App"
!endif

!ifdef DESCRIPTION
    VIAddVersionKey FileDescription "${DESCRIPTION}"
!endif

!ifdef COPYRIGHT
    VIAddVersionKey LegalCopyright "${COPYRIGHT}"
!endif

Первые 3 определяют установкуимена файлов для использования в ! system вызове GetAssemblyInfoForNSIS.exe.Этот системный вызов происходит во время компиляции вашего установщика и генерирует файл .nsh непосредственно перед его включением.Я использую ключ / NONFATAL, чтобы мой установщик не завершился сбоем, если при создании файла включения возникает ошибка.

11 голосов
/ 15 июня 2010

Вы можете сделать это без .NET, используя плагин GetVersion , но следуя той же базовой логике:

Вот вот ExtractVersionInfo.nsi:

!define File "...\path\to\your\app.exe"

OutFile "ExtractVersionInfo.exe"
SilentInstall silent
RequestExecutionLevel user

Section

 ## Get file version
 GetDllVersion "${File}" $R0 $R1
  IntOp $R2 $R0 / 0x00010000
  IntOp $R3 $R0 & 0x0000FFFF
  IntOp $R4 $R1 / 0x00010000
  IntOp $R5 $R1 & 0x0000FFFF
  StrCpy $R1 "$R2.$R3.$R4.$R5"

 ## Write it to a !define for use in main script
 FileOpen $R0 "$EXEDIR\App-Version.txt" w
  FileWrite $R0 '!define Version "$R1"'
 FileClose $R0

SectionEnd

Вы компилируете это один раз, а затем вызываете его из своего реального установщика:

; We want to stamp the version of the installer into its exe name.
; We will get the version number from the app itself.
!system "ExtractVersionInfo.exe"
!include "App-Version.txt"
Name "My App, Version ${Version}"
OutFile "MyApp-${Version}.exe"
3 голосов
/ 28 декабря 2017

Начиная с NSISv3.0 это можно сделать с помощью !getddlversion без использования стороннего программного обеспечения:

!getdllversion "MyApp.exe" ver
Name "MyName ${ver1}.${ver2}.${ver3}.${ver4}"
OutFile "my_name_install_v.${ver1}.${ver2}.${ver3}.${ver4}.exe"
3 голосов
/ 16 апреля 2012

Я нашел способ сделать это в вики NSIS:

http://nsis.sourceforge.net/Version_Info_manipulations_on_compile-time

1 голос
/ 10 мая 2017

Это можно сделать с помощью MSBuild.

  1. Просто добавьте сценарий .nsi в проект и задайте для этого свойства файла Copy to Output Directory значение Copy always или Copy if newer.

  2. Добавьте в свой файл проекта (например, .csproj или. vbproj) следующий код (предположим, что у вашего nsi сценария есть имя installer.nsi)

    <Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release'">
      <!-- Getting assembly information -->
      <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
        <Output TaskParameter="Assemblies" ItemName="myAssemblyInfo"/>
      </GetAssemblyIdentity>
      <!-- Compile NSIS installer script to get installer file -->
      <Exec Command='"%programfiles(x86)%\nsis\makensis.exe" /DVersion=%(myAssemblyInfo.Version) "$(TargetDir)installer.nsi"'>
        <!-- Just to show output from nsis to VS Output -->
        <Output TaskParameter="ConsoleOutput" PropertyName="OutputOfExec" />
      </Exec>
    </Target>
    
  3. Используйте переменную $Version в вашем скрипте nsi:

    # define installer name
    OutFile "MyApp-${Version}.exe"
    
0 голосов
/ 04 сентября 2018

Начиная с NSIS v3.0a0 вы можете сделать это прямо в скрипте, внешние инструменты не нужны: ! Getdllversion

Пример кода (из документации):

!getdllversion "$%WINDIR%\Explorer.exe" Expv_
!echo "Explorer.exe version is ${Expv_1}.${Expv_2}.${Expv_3}.${Expv_4}"
0 голосов
/ 08 ноября 2017

Вызов простого сценария VBS после компиляции NSIS:

Set ddr = CreateObject("Scripting.FileSystemObject")
Version = ddr.GetFileVersion( "..\path_to_version.exe" )
ddr.MoveFile "OutputSetup.exe", "OutputSetup_" & Version & ".exe"
...