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.
È necessario sostituire "." con ',' in FILEVERSION per farlo correttamente nel File | Proprietà | Scheda Dettagli della DLL. –