tutorial software nullsoft nsis

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"



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.

  1. Simplemente agregue su script .nsi al proyecto y establezca esta propiedad de archivo Copy to Output Directory valor del Copy to Output Directory Copy always o Copy if newer .

  2. 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>

  3. Use la variable $Version en su script nsi :

    # define installer name OutFile "MyApp-${Version}.exe"