NSIS-put EXE version dans le nom de l'installateur

ins a une variable Name que vous définissez dans le script:

Name "MyApp"

définit le nom de l'installateur, qui s'affiche comme le titre de la fenêtre, etc.

y a-t-il un moyen de retirer le numéro de Version .NET de mon EXE principal et de l'ajouter au nom?

de sorte que mon nom d'installateur serait automatiquement 'MyApp V2.2.0.0" ou peu importe?

16
demandé sur codeulike 2010-06-14 20:36:14

7 réponses

il y a peut-être une façon très simple de le faire, mais je ne sais pas ce que c'est. Quand j'ai commencé à utiliser les Ins, j'ai développé cette solution pour répondre à mes besoins et je n'ai pas revu le problème depuis pour voir s'il y a quelque chose de plus élégant.

je voulais que mes installateurs aient le même numéro de version, la même description et les mêmes informations de copyright que mon exécutable principal. Donc j'ai écrit une application C# courte appelée GetAssemblyInfoForNSIS qui tire cette information de fichier d'un exécutable et l'écrit dans une .fichier nsh inclus par mes installateurs.

Ici est l'application en 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");
            }
        }
    }
}

Donc si vous utilisez cette application comme ceci:

GetAssemblyInfoForNSIS.exe MyApp.exe MyAppVersionInfo.nsh

vous obtiendriez un fichier nommé MyAppVersionInfo.nsh qui ressemble à quelque chose comme ceci (en supposant que cette info est dans votre exécutable):

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

en haut de mon script ins, je fais quelque chose comme ceci:

!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

Les 3 premiers définit configurer les noms de fichier à utiliser dans le !système appel à Getassembly Infofornsis.EXE. Cet appel système a lieu pendant la compilation de votre installateur et génère le .nsh fichier juste avant de l'inclure. J'utilise le commutateur /NONFATAL pour que mon installateur ne tombe pas complètement en panne si une erreur se produit lors de la génération du fichier include.

22
répondu Kyle Gagnet 2010-06-14 19:37:23

vous pouvez le faire sans .NET en utilisant le getVersion plugin, mais en suivant la même logique de base:

Voici 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

vous compilez cela une fois, puis vous l'appelez à partir de votre vrai installateur:

; 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"
11
répondu Joshua Muskovitz 2010-06-15 14:48:05

j'ai trouvé une façon de le faire sur les INS wiki:

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

3
répondu Ashley Davis 2012-04-16 00:22:51
!getddlversion sans utiliser un logiciel tiers:

!getdllversion "MyApp.exe" ver
Name "MyName ${ver1}.${ver2}.${ver3}.${ver4}"
OutFile "my_name_install_v.${ver1}.${ver2}.${ver3}.${ver4}.exe"
3
répondu default locale 2018-01-03 05:55:28

vous pouvez y parvenir en utilisant MSBuild.

  1. il suffit d'ajouter votre .nsi script pour projeter et définir cette propriété de fichier Copy to Output Directory valeur Copy always ou Copy if newer.

  2. Ajouter à votre fichier de projet (par exemple,.csproj ou .vbproj) code suivant (supposons que votre nsi script a le nom 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. Utiliser $Version variable nsi script:

    # define installer name
    OutFile "MyApp-${Version}.exe"
    
1
répondu Vadim Ovchinnikov 2017-05-10 09:46:16

Appel simple script VBS après INS de la compilation:

Set ddr = CreateObject("Scripting.FileSystemObject")
Version = ddr.GetFileVersion( "..\path_to_version.exe" )
ddr.MoveFile "OutputSetup.exe", "OutputSetup_" & Version & ".exe"
0
répondu themadmax 2017-11-08 10:02:21

Depuis NSIS v3.0a0 vous pouvez le faire directement dans le script, pas d'outils externes requises: !getdllversion

exemple de code (tiré de la documentation):

!getdllversion "$%WINDIR%\Explorer.exe" Expv_
!echo "Explorer.exe version is ${Expv_1}.${Expv_2}.${Expv_3}.${Expv_4}"
0
répondu YePhIcK 2018-09-05 04:39:43