2010-01-18 22 views
12

Je suis occupé à automatiser nos builds pour inclure le numéro de révision svn. Nous utilisons Delphi 2010. J'ai ajouté un événement de pré-construction appelant un fichier batch qui injecte le numéro de révision svn (lu dans le fichier .svn dans le répertoire des entrées) et un numéro de version spécifié dans aVersionInfo.rc qui est compilé avec mon projet. L'événement pré-construction ressemble à ceci:Événement de pré-construction Delphi ne s'exécutant PAS AVANT la compilation

call SetVersionInfo.bat 6 5 4 

... et le fichier batch (espérons que quelqu'un trouve cela utile) ...

@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 

Le fichier de commandes ne s'exécute dans le cadre d'une compilation , aVersionInfo.rc est mis à jour, aVersionInfo.res est recompilé, mais pour une raison quelconque, le nouveau fichier res n'est pas utilisé pour compiler l'exe. Il est, cependant, mis à jour pendant une construction propre ou si je compile une deuxième fois. Il semble que la vérification des modifications apportées aux fichiers rc a lieu avant que les événements "pre" -build ne soient appelés. Ce qui en fait un événement de mi-construction. Ou est-ce que je manque quelque chose?

J'ai essayé de supprimer le fichier aVersionInfo.res en tant qu'autre événement de pré-construction, mais le compilateur se plaint que ce fichier est manquant. Se pourrait-il que le

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

ligne est au mauvais endroit?

Répondre

9

Essayez d'utiliser

{$R aVersionInfo.res} 

et appeler brcc32 aVersionInfo.rc manuellement à partir de votre fichier de commandes (après » re fait avec la création du fichier .rc). De cette façon, votre fichier .res devrait être exclu de la compilation IDE normale.

+0

Merci, fonctionne comme un charme –

1

Peut-être manque un [ "]
ECHO. VALEUR "ProductName"," APP \ 000" >> aVersionInfo.rc
ECHO. VALEUR "ProductVersion," 1 \ 000" >> aVersionInfo.rc
------- ICI -----------------------
ECHO. VALEUR "Commentaires", "Compilé% à ce jour% en% username% \ 000" >> aVersionInfo.rc Bye

+0

Désolé, mon erreur: Le "est inclus dans l'original, il vient de se perdre lorsque j'ai supprimé les informations spécifiques à la société.Bien fait pour le repérer si! –

0

Ajouter une ligne à votre fichier batch qui modifie le fichier source Delphi qui inclut la ressource:

touch VersionInfo.pas 

Ensuite, le fichier source doit recompilé. Si le fichier source n'est pas modifié, il n'y a aucune raison pour que le compilateur liez à nouveau cette partie du programme, et ainsi le fichier de ressource mis à jour ne sera pas remarqué.

+0

La ressource est incluse dans mon fichier .dpr Si je touche le fichier dpr, il ne récupère la modification qu'après la compilation et deux messages surgissent pour vous demander si je veux recharger le fichier .dproj et le fichier .rc Les informations de version de l'ancien fichier res sont toujours utilisées. –

0

Vous pouvez appeler brcc32 à l'intérieur du fichier de traitement par lots afin qu'il mette toujours à jour le fichier .res. Je fais quelque chose de similaire et cela fonctionne aussi bien dans une compilation que dans une compilation.

0

TL; DR:

Placez la ligne {$R 'aVersionInfo.res' 'aVersionInfo.rc'} directement au-dessous du programme déclaration une fois, puis construire. Ou utilisez BRCC32 pour forcer la construction de la première fois.RES fichier

Version longue:

Votre supposition que la ligne:

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

est au mauvais endroit est partiellement correcte. Lorsque j'ai commencé à utiliser un fichier .RC sous Delphi XE2, j'ai eu le même problème avec un code légèrement différent, parfois compilant et parfois pas. J'ai essayé des variations comme:

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

mais le compilateur XE2 se plaignait au sujet du RES fichier non être trouvé, si bien qu'il était pas là (notez que ce fut ma construction initiale).

Il se avère vous devez d'abord placer cette ligne directement au-dessous la déclaration du programme :

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

... et non à proximité de votre déjà

{$R *.res} 

Ensuite, vous construisez votre programme une fois.

Après cela, vous pouvez déplacer la ligne vers un endroit plus logique:

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

Pour une raison étrange, une fois que Delphi « sait » que le fichier .rc fait partie du projet, il ne importe plus si vous soit:

  • placer la ligne nulle part ailleurs
  • dispose d'un fichier .res présent ou non

Pas besoin d'une étape de précompilation. Si le fichier .RC est modifié, le compilateur reconstruira le fichier .RES, qu'une version antérieure existe ou non.

Ce comportement étrange ne permet pas vraiment quand vous configurez ce système initialement ;-(

Il y a d'autres choses étranges se passent avec l'analyse syntaxique de la source du projet et la construction du fichier qui .dproj m'a amené à cette solution, notamment:

Si vous renommez le fichier .rc, cela peut vous causer des problèmes: Il y a des restes dans le fichier .dproj pointant toujours vers l'ancien fichier .rc et le compilateur va se plaindre à propos de ne pas le trouver.Vous devez modifier cet ancien nom à partir du fichier .dproj pour résoudre ce problème

Notez que tout était sous XE2, sous une autre version YMMV.


Modifié ajouter: Vous pouvez toujours avoir à la bataille avec le numéro XE2 Version Info Not Working.