2010-02-10 8 views
7

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.

+0

Sie müssen die "." mit ',' in FILEVERSION, um es in der Datei | Eigenschaften | Details Registerkarte der DLL. –

Antwort

7

Die Replace TaskAction eingefügt Unicode-Zeichen, während die RC-Dateien ASCII-Codierung verwenden. Das Hinzufügen von TextEncoding = "ASCII" zu allen RC-Ersetzungsaufgaben führt zu kompilierbaren Dateien.

Eine Einschränkung der Verwendung des ASCII-Zeichensatzes besteht darin, dass Sie das © -Symbol nicht verwenden können. Aber wenn Sie TextEncoding = "Windows-1252" wählen, löst das Problem.

+1

Ich habe versucht, das gleiche mit der [MSBuild Community Aufgaben] 's (http://msbuildtasks.tigris.org/) 'FileUpdate' Aufgabe zu tun.Sie legen eine 'Encoding'-Eigenschaft offen, die gleich funktioniert. –

+2

\t granadaCoder

+0

Upvote für Jared. Und Shout-out an Anthony M ... seit ich die MSBuild.Community.Tasks benutzt habe ... und dein (AnthonyMs) Kommentar hat mich dazu gebracht, eine Google-Suche zu finden ... finde eine Übereinstimmung. Mein Problem war, dass ich, ohne die Kodierung einzustellen, einige seltsame Zeichen in meinem Ergebnis angezeigt bekam. Die komischen Charaktere waren: ï »¿ – granadaCoder

4

Ich würde die Versionsinformationen aus den Dateien AssemblyInfo.cs und *.rc trennen. Erstellen Sie eine AssemblyVersion.cs und Version.rc Datei, die die (allgemeine) Versionierungsinformationen für alle Ihre Assemblys enthalten. Sie würden diese zu Beginn Ihres Builds generieren. Da sie nur die Versionsinformationen enthalten, müssen Sie keine regulären Ausdrücke verwenden. Sie können die gesamte Datei jedes Mal überschreiben.

+0

"Alles kann durch eine weitere indirekte Ebene gelöst werden" –

+0

Ein anständiger Vorschlag. Die manuelle Bearbeitung all dieser Dateien ist sicherlich besser als jedes Mal, wenn wir sie erstellen. Allerdings fügen wir dem Build immer noch neue Projekte hinzu und es wäre schön, wenn diese Ergänzungen nahtlos wären. Außerdem bringt mich meine inhärente Faulheit des Programmierers dazu, Hoffnung für eine Lösung zu haben, die es mir ermöglicht, jede Handbearbeitung zu vermeiden. – Jared

+0

Dies ist eine gültige Empfehlung, auch wenn Sie die automatisierte Lösung weiterhin verwenden. Jedes Mal, wenn Sie eine Regex vermeiden können, sind Sie golden :) –

3

Sie müssen die Zeiträume (.) in der FILEVERSION durch Kommas ersetzen (,). Wenn Sie ohne das richtige Format erstellen, wird die Dateiversion nicht in den Eigenschaften der Datei angezeigt Detailseite. Ich würde weitermachen und das gleiche für die PRODUCTVERSION tun, obwohl es nicht notwendig scheint.

Ich verwendete MSBuild Property Functions. Ich bin sicher, dass Sie sie auch regex/ersetzen können.

<FileSystem.File TaskAction="Replace" 
       TextEncoding="ASCII" 
       Files="@(AppResource)" 
       RegexPattern="FILEVERSION\s+\S+" 
       Replacement="FILEVERSION $(Version.Replace('.',','))"/> 
+0

kannst du mir zeigen, wie du mit Eigentum gemacht hast. Ich habe das gleiche Problem, aber ich kann es nicht lösen. @ Antony Mastrean – Ani

Verwandte Themen