Ich wurde damit beauftragt, unseren Buildprozess mit Msbuild zu automatisieren. Wir haben etwa zwanzig Visual C++ - Projekte und zwanzig C# -Projekte, die es schwierig machen, alle Versionszeichenfolgen manuell zu bearbeiten. Unsere Versionsnummern werden zur Build-Zeit generiert. Daher müssen wir die vollständige Versionszeichenfolge als Eigenschaft in der Befehlszeile übergeben.Die Verwendung von MSBuild zum Aktualisieren der FILEVERSION in einer C++ - Ressourcendatei führt zu Kompilierungsfehlern
Meine ursprüngliche Implementierung verwendete die MSBuild Extension PackFile
Task, um Ersetzungen auf den .rc
und AssemblyInfo.cs
Dateien zu tun.
<FileSystem.File TaskAction="Replace" Files="@(AssemblyInfoFiles)" RegexPattern='\[assembly: AssemblyVersion\(".*"\)\]' Replacement='[assembly: AssemblyVersion("$(Version)")]'/>
<FileSystem.File TaskAction="Replace" Files="@(AssemblyInfoFiles)" RegexPattern='\[assembly: AssemblyFileVersion\(".*"\)\]' Replacement='[assembly: AssemblyFileVersion("$(Version)")]'/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern="FILEVERSION\s+\S+" Replacement="FILEVERSION $(Version)"/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern="PRODUCTVERSION\s+\S+" Replacement="PRODUCTVERSION $(Version)"/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern='VALUE\s+"FileVersion",\s*".*"' Replacement='VALUE "FileVersion", "$(Version)"'/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern='VALUE\s+"ProductVersion",\s*".*"' Replacement='VALUE "ProductVersion", "$(Version)"'/>
Das funktioniert großartig auf den AssemblyInfo.cs
Dateien, aber wenn ich eine der C++ kompilieren Projekte, die ich bekomme Fehler wie folgt aus:
.\MyProject.rc(23): error RC2135: file not found: 0x09
.\MyProject.rc(71): error RC2135: file not found: 1
.\MyProject.rc(72): error RC2135: file not found: 6
.\MyProject.rc(73): error RC2135: file not found: 6
.\MyProject.rc(74): error RC2135: file not found: 0x3fL
.\MyProject.rc(80): error RC2135: file not found: FILEOS
.\MyProject.rc(81): error RC2135: file not found: 0x2L
.\MyProject.rc(84): error RC2164: unexpected value in RCDATA
.\MyProject.rc(86): error RC2135: file not found: BLOCK
.\MyProject.rc(88): error RC2135: file not found: VALUE
Der erste Fehler auf der Leitung 23 auftritt, aber wenn ich diff MyProject.rc
gegen Quellcode-Kontrolle alles sieht OK aus. Nur die Versionsnummern werden geändert, diese Änderungen beginnen in Zeile 72, und die Zeichenfolge 0x09
wird nirgendwo in der Datei angezeigt. Was in der Welt geht hier vor? Zeilen 21 bis 25 wie folgt aussehen:
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
bin ich auch für alle Vorschläge auf andere Methoden offen das gleiche Ziel zu erreichen.
Sie müssen die "." mit ',' in FILEVERSION, um es in der Datei | Eigenschaften | Details Registerkarte der DLL. –