7 Stimmen

Automatisches Abrufen der EXE-Dateiversion zum Einbetten in die Metadaten des NSIS-Installationsprogramms

Ich versuche, einen weiteren Schritt im Freigabeprozess meiner Anwendung zu entfernen, indem ich automatisch Versionsinformationen aus meiner ausführbaren Datei (in diesem Fall eine .NET-Anwendung) abrufe.

Bis jetzt konnte ich mit einem begrenzten Wissen über NSIS auskommen, aber ich lerne schnell, dass dies nicht ausreicht.

Schritt 1: Versionsinformationen in der ausführbaren Datei deklarieren

In AssemblyInfo.cs deklariere ich [assembly: AssemblyVersion("1.0.0.1")] . Dadurch wird die Versionsinformation in der kompilierten ausführbaren Datei angezeigt (unter "Dateiversion" und "Produktversion").

Schritt 2: Versionsinformationen aus der ausführbaren Datei abrufen

Nach diesem Artikel über "GetFileVersion" Wenn Sie "FileFunc.nsh" importieren, können Sie Versionsinformationen von einer ausführbaren Datei abrufen.

Verwendeter Code:

Section
    Var /GLOBAL version
    ${GetFileVersion} "C:\test.exe" $version
    ...
SectionEnd

Schritt 3: Überprüfen des Inhalts des Funktionsaufrufs

Basierend auf Abschnitt 5.1.7 der Dokumentation Ich sollte in der Lage sein, während der Kompilierungszeit mit dem Befehl "!echo" in die Befehlszeile zu drucken. Der Unterschied zwischen dem Ausdruck des Inhalts einer Variablen (oder einer Konstanten usw.) verwirrt mich immer noch, daher habe ich alle vier Optionen ausprobiert:

!echo $version
!echo "$version"
!echo "${version}"
!echo ${version}

Dies führt zu:

$version (InstallScript.nsi:15)
$version (InstallScript.nsi:16)
${version} (InstallScript.nsi:17)
${version} (InstallScript.nsi:18)

Schritt 4: Deklarieren Sie die Metadaten des Installationsprogramms

Basierend auf Abschnitt 4.8.3 sollte ich in der Lage sein, die Metadaten des Installers über VIProductVersion y VIAddVersionKey .

VIProductVersion $version 
VIAddVersionKey "FileVersion" "$version"

Im erstellten Installationsprogramm wird dadurch die Zeichenfolge "$version" in die angegebenen Felder eingefügt.


Gibt es eine ToString() Äquivalent in NSIS? Wie kann ich auf den Inhalt einer Variablen zugreifen? Bedeutet der Ausdruck des Variablennamens, dass die Variable keinen Inhalt hat? Wie kann ich überprüfen, ob GetFileVersion korrekt aufgerufen wird, korrekt ausgeführt wird und einen Wert zurückgibt?

13voto

Anders Punkte 89514

Bearbeiten: NSIS v3 enthält jetzt eine !getdllversion Präprozessoranweisung zu verwenden, benötigen Sie die GetVersionLocal-Umgehung nur, wenn Sie noch NSIS v2 verwenden.

Es gibt Pläne für eine !getdllversion . in NSIS 2.47, müssen Sie vorerst diesen Workaround verwenden:

outfile test.exe
requestexecutionlevel user

!macro GetVersionLocal file basedef
!verbose push
!verbose 1
!tempfile _GetVersionLocal_nsi
!tempfile _GetVersionLocal_exe
!appendfile "${_GetVersionLocal_nsi}" 'Outfile "${_GetVersionLocal_exe}"$\nRequestexecutionlevel user$\n'
!appendfile "${_GetVersionLocal_nsi}" 'Section$\n!define D "$"$\n!define N "${D}\n"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'GetDLLVersion "${file}" $2 $4$\n'
!appendfile "${_GetVersionLocal_nsi}" 'IntOp $1 $2 / 0x00010000$\nIntOp $2 $2 & 0x0000FFFF$\n'
!appendfile "${_GetVersionLocal_nsi}" 'IntOp $3 $4 / 0x00010000$\nIntOp $4 $4 & 0x0000FFFF$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileOpen $0 "${_GetVersionLocal_nsi}" w$\nStrCpy $9 "${N}"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileWrite $0 "!define ${basedef}1 $1$9"$\nFileWrite $0 "!define ${basedef}2 $2$9"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileWrite $0 "!define ${basedef}3 $3$9"$\nFileWrite $0 "!define ${basedef}4 $4$9"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileClose $0$\nSectionend$\n'
!system '"${NSISDIR}\makensis" -NOCD -NOCONFIG "${_GetVersionLocal_nsi}"' = 0
!system '"${_GetVersionLocal_exe}" /S' = 0
!delfile "${_GetVersionLocal_exe}"
!undef _GetVersionLocal_exe
!include "${_GetVersionLocal_nsi}"
!delfile "${_GetVersionLocal_nsi}"
!undef _GetVersionLocal_nsi
!verbose pop
!macroend

!insertmacro GetVersionLocal "$%windir%\Explorer.exe" MyVer_
VIProductVersion "${MyVer_1}.${MyVer_2}.${MyVer_3}.${MyVer_4}"
VIAddVersionKey "FileVersion" "${MyVer_1}.${MyVer_2}.${MyVer_3}.${MyVer_4}"

page instfiles
section
sectionend

Dieses Makro:

  1. Erzeugt eine temporäre .nsi-Datei
  2. Kompiliert die temporäre .nsi zu einer temporären ausführbaren Datei
  3. Führt die temporäre .exe-Datei aus
  4. Löscht die beiden Dateien (.nsi und .exe)
  5. Gibt ein Array mit den Versionsinformationen der angegebenen ausführbaren Datei zurück.

10voto

yclkvnc Punkte 853

Aktualisierte Informationen:

NSIS enthält jetzt den Befehl !getdllversion, der dasselbe tut. Verwendung:

!getdllversion "$%windir%\explorer.exe" expv_
!echo "Explorer.exe version is ${expv_1}.${expv_2}.${expv_3}.${expv_4}"

UPDATE : !getdllversion Befehl ist ein "Compile Time Command", er unterscheidet sich von dem GetDLLVersion Anweisung. IMO hätte sie folgendermaßen benannt werden müssen !getdllversionlocal um Verwechslungen vorzubeugen, da es ähnlich ist wie GetDLLVersionLocal Anweisung, nicht die GetDLLVersion

Im Benutzerhandbuch von NSIS 3.0a1 heißt es dazu:

5.1.14 !getdllversion

localfilename define_baseame

Dies ist ähnlich wie GetDLLVersionLocal, nur dass es Nummer in Defines und kann daher überall verwendet werden, nicht nur innerhalb von Funktionen und Abschnitten.

!getdllversion "$%windir%\explorer.exe" expv_
!echo "Explorer.exe version is ${expv_1}.${expv_2}.${expv_3}.${expv_4}"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X