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?
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.
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"
j'ai trouvé une façon de le faire sur les INS wiki:
http://nsis.sourceforge.net/Version_Info_manipulations_on_compile-time
!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"
vous pouvez y parvenir en utilisant MSBuild.
il suffit d'ajouter votre
.nsi
script pour projeter et définir cette propriété de fichierCopy to Output Directory
valeurCopy always
ouCopy if newer
.Ajouter à votre fichier de projet (par exemple,
.csproj
ou .vbproj
) code suivant (supposons que votrensi
script a le nominstaller.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>
Utiliser
$Version
variablensi
script:# define installer name OutFile "MyApp-${Version}.exe"
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"
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}"