2010-02-10 15 views
7

Se me ha encomendado la tarea de automatizar nuestro proceso de compilación con msbuild. Tenemos aproximadamente veinte proyectos de Visual C++ y veinte proyectos de C#, por lo que es una molestia editar todas las cadenas de versiones a mano. Nuestros números de versión son carnes generadas en tiempo de compilación, por lo que tenemos que pasar la cadena de versión completa como una propiedad en la línea de comandos.El uso de MSBuild para actualizar el archivo FILEVERSION en un archivo de recursos de C++ causa errores de compilación

Mi implementación inicial usó MSBuild Extension Pack's File tarea para hacer reemplazos en los archivos .rc y 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)"'/> 

Esto está funcionando muy bien en los archivos AssemblyInfo.cs, pero cuando compilar cualquiera de los proyectos de C++ recibo errores como este:

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

se encuentra el primer error en la línea 23, pero cuando diff MyProject.rc contra el control de fuente todo se ve bien. Solo se cambian los números de versión, esos cambios comienzan en la línea 72, y la cadena 0x09 no aparece en ninguna parte del archivo. ¿Qué demonios está pasando aquí? Líneas 21 - 25 En este aspecto:

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

También estoy abierto a cualquier sugerencia sobre otros métodos para lograr el mismo objetivo.

+0

Debes reemplazar el '.' con ',' en FILEVERSION para hacerlo bien en el archivo | Propiedades | Pestaña de detalles de la DLL. –

Respuesta

7

Replace TaskAction estaba insertando caracteres Unicode mientras los archivos rc usan codificación ASCII. Agregar TextEncoding = "ASCII" a todas las tareas de reemplazo rc da como resultado archivos compilables.

Una limitación del uso del juego de caracteres ASCII es que no puede usar el símbolo ©. Pero si elige TextEncoding = "Windows-1252" eso resuelve el problema.

+1

Estaba tratando de hacer lo mismo con la tarea de [Actualizaciones de la comunidad de MSBuild] (http://msbuildtasks.tigris.org/) 'FileUpdate'.Exponen una propiedad 'Codificación 'que funciona igual. –

+2

\t granadaCoder

+0

Upvote para Jared. Y a Shout-out a Anthony M ... ya que estaba usando MSBuild.Community.Tasks ... y tu comentario (de AnthonyM) es lo que hizo que mi búsqueda en Google ... encontrara una coincidencia. Mi problema era que sin configurar la codificación ... estaba obteniendo algunos personajes extraños en mi resultado. Los personajes raros eran: ï »¿ – granadaCoder

4

Yo separaría la información de la versión de los archivos AssemblyInfo.cs y *.rc. Cree un archivo AssemblyVersion.cs y Version.rc, que contiene la información de versiones (común) para todos sus ensamblajes. Usted los generaría al comienzo de su construcción. Como solo contienen la información de versión, no es necesario que use expresiones regulares, puede sobrescribir el archivo completo cada vez.

+0

"Cualquier cosa puede ser resuelta por una capa más de indirección" –

+0

Una sugerencia decente. Edición manual de todos esos archivos una vez es ciertamente mejor que hacerlo cada vez que creamos, sin embargo, todavía estamos agregando nuevos proyectos a la construcción y sería bueno que esas adiciones sean integrales. Además, mi inherente pereza de programador me hace esperar una solución que me permita evitar cualquier edición manual. – Jared

+0

Esta es una recomendación válida incluso si continúa utilizando la solución automatizada. Cada vez que puede evitar una expresión regular, está dorado :) –

3

Aún necesita reemplazar los períodos (.) en el FILEVERSION con comas (,). Si compila sin el formato correcto, no verá la versión del archivo en las propiedades del archivo | página de detalles. Me gustaría seguir y hacer lo mismo para el PRODUCTVERSION, aunque no parece ser necesario.

He usado MSBuild Property Functions. Estoy seguro de que puedes regex/reemplazarlos también.

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

puede mostrarme cómo lo hizo con la propiedad. Tengo el mismo problema, pero no puedo resolverlo. @Anthony Mastrean – Ani

Cuestiones relacionadas