Ответ 1
Может быть, очень простой способ сделать это, но я не знаю, что это такое. Когда я впервые начал использовать NSIS, я разработал это обходное решение в соответствии с моими потребностями и не пересмотрел проблему, потому что, чтобы увидеть, есть ли что-то более элегантное.
Я хотел, чтобы мои установщики имели тот же номер версии, описание и информацию об авторских правах, что и мой основной исполняемый файл. Поэтому я написал короткое приложение С#, называемое GetAssemblyInfoForNSIS, которое извлекает эту информацию о файле из исполняемого файла и записывает его в файл .nsh, который включают мои установщики.
Вот приложение С#:
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");
}
}
}
}
Итак, если вы используете это приложение так:
GetAssemblyInfoForNSIS.exe MyApp.exe MyAppVersionInfo.nsh
Вы получите файл с именем MyAppVersionInfo.nsh, который выглядит примерно так (если эта информация находится в вашем исполняемом файле):
!define VERSION "2.0"
!define DESCRIPTION "My awesome application"
!define COPYRIGHT "Copyright © Me 2010"
В верхней части моего NSIS script я делаю что-то вроде этого:
!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
Первые три определяют имена файлов, которые будут использоваться в ! system для вызова GetAssemblyInfoForNSIS.exe. Этот системный вызов выполняется во время компиляции установщика и генерирует файл .nsh прямо перед его включением. Я использую переключатель /NONFATAL, чтобы мой установщик не полностью сбой, если возникла ошибка при создании файла include.