nullsoft - nsis software installer
NSIS-ponga la versiĆ³n EXE en el nombre del instalador (7)
Desde NSIS v3.0a0 puede hacerlo directamente en el script, sin necesidad de herramientas externas !getdllversion
Código de muestra (de la documentación):
!getdllversion "$%WINDIR%/Explorer.exe" Expv_
!echo "Explorer.exe version is ${Expv_1}.${Expv_2}.${Expv_3}.${Expv_4}"
NSIS tiene una variable de nombre que usted define en el script:
Name "MyApp"
Define el nombre del instalador, que se muestra como el título de la ventana, etc.
¿Hay alguna forma de sacar el número de versión .NET de mi EXE principal y agregarlo al Nombre?
¿Para que mi nombre de instalador sea automáticamente ''MyApp V2.2.0.0 "o lo que sea?
Desde NSISv3.0, esto se puede hacer con !getddlversion
sin utilizar ningún software de terceros:
!getdllversion "MyApp.exe" ver
Name "MyName ${ver1}.${ver2}.${ver3}.${ver4}"
OutFile "my_name_install_v.${ver1}.${ver2}.${ver3}.${ver4}.exe"
Encontré una manera de hacer esto en el wiki de NSIS:
http://nsis.sourceforge.net/Version_Info_manipulations_on_compile-time
Llame al script VBS simple después de compilar NSIS:
Set ddr = CreateObject("Scripting.FileSystemObject")
Version = ddr.GetFileVersion( "../path_to_version.exe" )
ddr.MoveFile "OutputSetup.exe", "OutputSetup_" & Version & ".exe"
Puede haber una forma muy simple de hacer esto, pero no sé qué es. Cuando comencé a usar NSIS, desarrollé esta solución para satisfacer mis necesidades y no he vuelto a examinar el problema desde entonces para ver si hay algo más elegante.
Quería que mis instaladores tuvieran el mismo número de versión, descripción e información de copyright que mi ejecutable principal. Así que escribí una breve aplicación de C # llamada GetAssemblyInfoForNSIS que extrae la información del archivo de un archivo ejecutable y la escribe en un archivo .nsh que incluyen mis instaladores.
Aquí está la aplicación 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");
}
}
}
}
Así que si usas esa aplicación así:
GetAssemblyInfoForNSIS.exe MyApp.exe MyAppVersionInfo.nsh
Obtendría un archivo llamado MyAppVersionInfo.nsh que se parece a esto (asumiendo que esta información está en su ejecutable):
!define VERSION "2.0"
!define DESCRIPTION "My awesome application"
!define COPYRIGHT "Copyright © Me 2010"
En la parte superior de mi script NSIS, hago algo como esto:
!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
Las 3 primeras definiciones configuran los nombres de archivo para usar en la llamada del !system GetAssemblyInfoForNSIS.exe. Esta llamada al sistema se realiza durante la compilación del instalador y genera el archivo .nsh justo antes de incluirlo. Utilizo el modificador / NONFATAL para que mi instalador no falle completamente si se produce un error al generar el archivo de inclusión.
Puede hacer esto sin .NET usando el complemento GetVersion , pero siguiendo la misma lógica básica:
Aquí está 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
Usted compila esto una vez, y luego lo llama desde su instalador real:
; 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"
Puedes lograr esto usando MSBuild.
Simplemente agregue su script
.nsi
al proyecto y establezca esta propiedad de archivoCopy to Output Directory
valor delCopy to Output Directory
Copy always
oCopy if newer
.Agregue a su archivo de proyecto (p.
vbproj
.<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>
Use la variable
$Version
en su scriptnsi
:# define installer name OutFile "MyApp-${Version}.exe"