2010-02-10 11 views
7

Sono stato incaricato di automatizzare il nostro processo di compilazione con msbuild. Abbiamo una ventina di progetti Visual C++ e venti progetti C# che rendono difficile la modifica di tutte le stringhe di versione. I nostri numeri di versione sono generati a mano al momento della compilazione, quindi è necessario passare la stringa della versione completa come proprietà sulla riga di comando.L'uso di MSBuild per aggiornare FILEVERSION in un file di risorse C++ causa errori di compilazione

La mia implementazione iniziale ha utilizzato l'attività File per eseguire sostituzioni nei file .rc e AssemblyInfo.cs.

<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)"'/> 

Questo sta lavorando molto sui file AssemblyInfo.cs, ma quando compilo uno dei progetti C++ ricevo errori come questo:

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

è verificato il primo errore sulla linea 23, ma quando ho diff MyProject.rc contro il controllo del codice tutto sembra OK. Vengono modificati solo i numeri di versione, tali modifiche iniziano sulla riga 72 e la stringa 0x09 non viene visualizzata in nessun punto del file. Cosa diavolo sta succedendo qui? Linee 21 - 25 simile a questa:

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 
#ifdef _WIN32 
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 
#pragma code_page(1252) 
#endif //_WIN32 

Sono anche aperti a tutti i suggerimenti su altri metodi per raggiungere lo stesso obiettivo.

+0

È necessario sostituire "." con ',' in FILEVERSION per farlo correttamente nel File | Proprietà | Scheda Dettagli della DLL. –

risposta

7

Sostituire TaskAction stava inserendo caratteri Unicode mentre i file rc utilizzano la codifica ASCII. L'aggiunta di TextEncoding = "ASCII" a tutte le attività di sostituzione di rc si traduce in file compilabili.

Una limitazione dell'utilizzo del set di caratteri ASCII è che non è possibile utilizzare il simbolo ©. Ma se si seleziona TextEncoding = "Windows-1252" che risolve il problema.

+1

Stavo cercando di fare lo stesso con l'attività [MSBuild Community Tasks] (http://msbuildtasks.tigris.org/) 'FileUpdate'.Espongono una proprietà 'Encoding' che funziona allo stesso modo. –

+2

\t granadaCoder

+0

Voto superiore per Jared. E gridare ad Anthony M ... visto che stavo usando MSBuild.Community.Tasks ... e il tuo commento (di AnthonyM) è ciò che ha reso la mia ricerca su google ... trovare una corrispondenza. Il mio problema era che senza impostare la codifica ... Stavo ottenendo alcuni caratteri strani mostrati nel mio risultato. I personaggi strambi erano: ï »¿ – granadaCoder

4

Vorrei separare le informazioni sulla versione dai file AssemblyInfo.cs e *.rc. Creare un file AssemblyVersion.cs e Version.rc, che contiene le informazioni di versione (comune) per tutti i vostri assiemi. Li genereresti all'inizio della tua build. Poiché contengono solo le informazioni sulla versione non è necessario utilizzare le espressioni regolari, è possibile sovrascrivere l'intero file ogni volta.

+0

"Qualsiasi cosa può essere risolta da un ulteriore livello di riferimento indiretto" –

+0

Un suggerimento decente. La modifica manuale di tutti quei file una volta è sicuramente migliore rispetto a farlo ogni volta che si costruisce, tuttavia stiamo ancora aggiungendo nuovi progetti alla build e sarebbe bello che quelle aggiunte fossero senza soluzione di continuità. Inoltre, la mia pigrizia programmatrice intrinseca mi fa sperare in una soluzione che mi consenta di evitare qualsiasi modifica manuale. – Jared

+0

Questa è una raccomandazione valida anche se si continua a utilizzare la soluzione automatizzata. Ogni volta che riesci a evitare un'espressione regolare, sei d'oro :) –

3

È ancora necessario sostituire i periodi (.) nello FILEVERSION con le virgole (,). Se crei senza il formato corretto, non vedrai la versione del file nelle proprietà del file | pagina dei dettagli. Vorrei andare avanti e fare lo stesso per il PRODUCTVERSION, anche se non sembra essere necessario.

Ho utilizzato MSBuild Property Functions. Sono sicuro che è possibile regex/sostituirli anche.

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

puoi mostrarmi come hai fatto con la proprietà. Ho lo stesso problema, ma non riesco a risolverlo. @ Anthony Mastrean – Ani

Problemi correlati