2010-01-18 16 views
12

Estoy ocupado automatizando nuestras compilaciones para incluir el número de revisión de svn. Estamos utilizando Delphi 2010. Agregué un evento de precompilación que llamaba a un archivo por lotes que inyecta el número de revisión svn (leído del archivo de entradas en el directorio .svn) y un número de versión especificado en aVersionInfo.rc compilado con mi proyecto. El evento de pre-construcción se ve así:Evento de preconstrucción de Delphi no se ejecuta ANTES de compilar

call SetVersionInfo.bat 6 5 4 

... y el archivo por lotes (espero que alguien encuentre esto útil) ...

@ECHO OFF 
SETLOCAL 
setLocal EnableDelayedExpansion 

SET _myVar=0 
FOR /F %%G in (.svn\entries.) DO (
IF !_myVar! LSS 3 SET /A _myVar+=1 & SET _svn_dir_rev=%%G 
) 

ECHO 1 VERSIONINFO > aVersionInfo.rc 
ECHO. FILEVERSION %1,%2,%3,%_svn_dir_rev% >> aVersionInfo.rc 
ECHO. PRODUCTVERSION 1 >> aVersionInfo.rc 
ECHO. FILEOS VOS__WINDOWS32 >> aVersionInfo.rc 
ECHO. FILETYPE VFT_APP >> aVersionInfo.rc 
ECHO. BEGIN >> aVersionInfo.rc 
ECHO. BLOCK "StringFileInfo" >> aVersionInfo.rc 
ECHO. BEGIN >> aVersionInfo.rc 
ECHO.  BLOCK "080904b0" >> aVersionInfo.rc 
ECHO.  BEGIN >> aVersionInfo.rc 
ECHO.  VALUE "CompanyName","COMPANY\000" >> aVersionInfo.rc 
ECHO.  VALUE "FileDescription","APP\000" >> aVersionInfo.rc 
ECHO.  VALUE "FileVersion","%1.%2.%3.%_svn_dir_rev%\000" >> aVersionInfo.rc 
ECHO.  VALUE "InternalName","APP\000" >> aVersionInfo.rc 
ECHO.  VALUE "LegalCopyright","Copyright APP\000" >> aVersionInfo.rc 
ECHO.  VALUE "LegalTrademarks","APP\000" >> aVersionInfo.rc 
ECHO.  VALUE "OriginalFilename","APP.exe\000" >> aVersionInfo.rc 
ECHO.  VALUE "ProductName","APP\000" >> aVersionInfo.rc 
ECHO.  VALUE "ProductVersion,"1\000" >> aVersionInfo.rc 
ECHO.  VALUE "Comments","Compiled on %date% by %username%\000" >> aVersionInfo.rc 
ECHO.  END >> aVersionInfo.rc 
ECHO. END >> aVersionInfo.rc 
ECHO. BLOCK "VarFileInfo" >> aVersionInfo.rc 
ECHO. BEGIN >> aVersionInfo.rc 
ECHO.  VALUE "Translation", 0x0809 1200 >> aVersionInfo.rc 
ECHO. END >> aVersionInfo.rc 
ECHO. END >> aVersionInfo.rc 
ENDLOCAL 

el archivo por lotes no se ejecutan como parte de una compilación , aVersionInfo.rc se actualiza, aVersionInfo.res se vuelve a compilar, pero por alguna razón el nuevo archivo res no se usa para compilar el exe. Sin embargo, se actualiza durante una compilación limpia o si compilo por segunda vez. Parece que la comprobación de cambios en los archivos rc tiene lugar antes de que se invoquen los eventos "pre" -build. Lo que realmente lo convierte en un evento de construcción media. ¿O me estoy perdiendo algo?

Intenté eliminar el archivo aVersionInfo.res como otro evento de precompilación, pero luego el compilador se queja de que falta este archivo. ¿Podría ser que el

{$R 'aVersionInfo.res' 'aVersionInfo.rc'} 

línea está en el lugar equivocado?

Respuesta

9

Intente utilizar

{$R aVersionInfo.res} 

y llamando brcc32 aVersionInfo.rc manualmente desde su archivo por lotes (después de' rehacer con la creación del archivo .rc). De esta forma, su archivo .res debe excluirse de la compilación IDE normal.

+0

Gracias, funciona como un encanto –

1

Puede ser que falta una [ "]
ECHO. VALOR "ProductName"," APP \ 000" >> aVersionInfo.rc
ECHO. VALOR "ProductVersion," 1 \ 000" >> aVersionInfo.rc
------- AQUÍ -----------------------^
ECHO. VALOR "Comentarios", "Compilado con fecha%% por% username% \ 000" >> aVersionInfo.rc adiós

+0

Lo siento, mi error: el "está incluido en el original, simplemente se perdió cuando eliminé información específica de la compañía. ¡Bien hecho para detectarlo! –

0

añadir una línea a su archivo por lotes que modifica el archivo fuente de Delphi que incluye el recurso:

touch VersionInfo.pas 

A continuación, el archivo de origen debe recompilado. Si el archivo fuente no se modifica, entonces no hay ninguna razón para que el compilador vuelva a vincular esa parte del programa, por lo que no se notará el archivo de recursos actualizado.

+0

El recurso está incluido en mi .dpr archivo .Si toco el archivo dpr, solo recoge el cambio después de la compilación y aparecen dos mensajes que me preguntan si deseo volver a cargar el archivo .dproj y el archivo .rc. La información de la versión del archivo res anterior todavía se usa. –

0

Puede llamar a brcc32 dentro del archivo por lotes para que siempre actualice el archivo .res. Hago algo similar y funciona tanto en compilación como en compilación.

0

TL; DR:

Coloque la línea de {$R 'aVersionInfo.res' 'aVersionInfo.rc'} directamente debajo de la Programa comunicado vez, y luego construir. O use BRCC32 para forzar la primera compilación de.RES archivo

Versión larga:

Su conjetura que la línea:

{$R 'aVersionInfo.res' 'aVersionInfo.rc'} 

está en el lugar equivocado es parcialmente correcta.

Cuando inicialmente configuré usando un archivo .RC en Delphi XE2, tuve el mismo problema con un código ligeramente diferente, algunas veces compilando y otras no. Probé variaciones como:

{$R 'aVersionInfo.res' 'aVersionInfo.rc'} 
{$R '.\aVersionInfo.res' '.\aVersionInfo.rc'} 

pero el compilador XE2 seguía quejándose de los RES archivo no se encuentra, si es que no estaba allí (en cuenta que esta era mi construcción inicial).

Resulta que primero hay que colocar esa línea directamente debajo de la Programa declaración:

program TTClient; 
{$R 'VersionInfo.res' 'VersionInfo.rc'} 

... y no en las cercanías de su ya presente

{$R *.res} 

Entonces construye su programa una vez.

Después de que se puede mover la línea de nuevo a un lugar más lógico:

{$R *.res} 
{$R 'VersionInfo.res' 'VersionInfo.rc'} 

Por alguna extraña razón, una vez que Delphi 'sabe' que el archivo .rc es parte del proyecto, ya no importa si:

  • lugar de la línea en cualquier otro lugar
  • tiene presentar una .res presente o no

No es necesario un paso de precompilación. Si se modifica el archivo .RC, el compilador reconstruirá el archivo .RES, ya sea que exista o no una versión anterior.

Este comportamiento extraño en realidad no ayuda al configurar este sistema inicialmente ;-(

Hay otras cosas extrañas ocurriendo con el análisis de la fuente del proyecto y la construcción del archivo .dproj cuales me trajo a esta solución, notablemente:

Si cambia el nombre del archivo .rc, esto puede meterlo nuevamente en problemas: hay remanentes en el archivo .dproj que aún apuntan al antiguo archivo .rc y el compilador se quejará sobre no encontrarlo. Debe editar este nombre antiguo fuera del archivo .dproj para solucionarlo.

Tenga en cuenta que esto era todo bajo XE2, bajo otra versión YMMV.


Editado para agregar: Es posible que aún tienen que luchar con XE2 Version Info Not Working tema.

Cuestiones relacionadas