2010-01-18 21 views
12

संकलित करने से पहले निष्पादित नहीं कर रहा है, मैं svn संशोधन संख्या को शामिल करने के लिए हमारे निर्माण को स्वचालित करने में व्यस्त हूं। हम डेल्फी 2010 का उपयोग कर रहे हैं। मैंने एक बैच फ़ाइल को कॉल करने वाला प्री-बिल्ड इवेंट जोड़ा जो svn संशोधन संख्या (.svn निर्देशिका में प्रविष्टियों फ़ाइल से पढ़ा जाता है) और एक निर्दिष्ट संस्करण संख्या को AVersionInfo.rc में संकलित करता है जिसे संकलित किया गया है मेरी परियोजना। पूर्व निर्माण घटना इस तरह दिखता है:डेल्फी प्री-बिल्ड इवेंट

call SetVersionInfo.bat 6 5 4 

... और बैच फ़ाइल (कोई इस उपयोगी पाता आशा) ...

@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 

बैच फ़ाइल एक संकलन के हिस्से के रूप निष्पादित करता है , aVersionInfo.rc अपडेट किया गया है, aVersionInfo.res को फिर से संकलित किया गया है, लेकिन किसी कारण से नई res फ़ाइल का उपयोग exe संकलित करने के लिए नहीं किया जाता है। हालांकि, यह एक स्वच्छ निर्माण के दौरान अद्यतन किया गया है या यदि मैं दूसरी बार संकलित करता हूं। ऐसा लगता है कि आरसी फाइलों में बदलावों की जांच "पूर्व" -बिल्ड घटनाओं से पहले होती है। जो वास्तव में इसे मिड-बिल्ड इवेंट बनाता है। या क्या मैं कुछ न कुछ भूल रहा हूं?

मैंने एक अन्य प्री-बिल्ड ईवेंट के रूप में aVersionInfo.res फ़ाइल को हटाने का प्रयास किया, लेकिन फिर संकलक शिकायत करता है कि यह फ़ाइल गुम है। क्या यह हो सकता है कि

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

लाइन गलत जगह पर है?

उत्तर

9

{$R aVersionInfo.res} 

का उपयोग करने और brcc32 aVersionInfo.rc अपने बैच फ़ाइल से मैन्युअल रूप से कॉल करके देखें .rc फ़ाइल बनाने के साथ फिर से किया गया)। इस तरह आपकी .res फ़ाइल को सामान्य आईडीई बिल्ड से बाहर रखा जाना चाहिए।

touch VersionInfo.pas 

तो स्रोत फ़ाइल कंपाइल किया जाना चाहिए:

+0

धन्यवाद, एक आकर्षण की तरह काम करता है –

1

हो सकता है याद आ रही है एक [ "]
ECHO। मूल्य" ProductName "," एपीपी \ 000 ">> aVersionInfo.rc
ECHO। VALUE," ProductVersion, "1 \ 000" >> aVersionInfo.rc
------- यहां -----------------------^
ईसीएचओ। (आप के बाद 'VALUE "टिप्पणी", >> aVersionInfo.rc अलविदा "% उपयोगकर्ता नाम% \ 000 से% तिथि% पर संकलित"

+0

क्षमा करें, मेरी गलती: "मूल में शामिल है, जब मैंने कंपनी की विशिष्ट जानकारी हटा दी तो यह अभी खो गया है। हालांकि इसे स्पॉट करने के लिए अच्छा किया गया है! –

0

अपने बैच फ़ाइल कि डेल्फी स्रोत फ़ाइल है कि संसाधन भी शामिल है को संशोधित करने के लिए एक पंक्ति जोड़ें। यदि स्रोत फ़ाइल संशोधित नहीं की गई है, तो कंपाइलर के उस भाग को फिर से लिंक करने का कोई कारण नहीं है, और इसलिए अद्यतन संसाधन फ़ाइल पर ध्यान नहीं दिया जाएगा।

+0

संसाधन मेरे .dpr में शामिल है फ़ाइल। अगर मैं डीपीआर फ़ाइल को छूता हूं तो यह संकलन के बाद ही बदलाव को उठाता है और दो संदेश पूछते हैं कि क्या मैं .dproj फ़ाइल और .rc फ़ाइल को फिर से लोड करना चाहता हूं। पुरानी रेज फ़ाइल से संस्करण जानकारी अभी भी उपयोग की जाती है। –

0

आप बैच फ़ाइल के अंदर brcc32 को कॉल कर सकते हैं ताकि यह हमेशा .res फ़ाइल को अपडेट कर सके। मैं कुछ ऐसा ही करता हूं और यह एक संकलन के साथ-साथ एक निर्माण में भी काम करता है।

0

टी एल; डॉ:

प्लेस एक बार, तो निर्माण लाइन {$R 'aVersionInfo.res' 'aVersionInfo.rc'} सीधे कार्यक्रम बयान नीचे। या पहली बार निर्माण करने के लिए BRCC32 का उपयोग करें।

आपका अनुमान है कि लाइन: आरईएस

लांग संस्करण फ़ाइल

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

गलत स्थान पर है आंशिक रूप से सही है।

जब मैंने शुरुआत में डेल्फी एक्सई 2 के तहत आरसी फ़ाइल का उपयोग करके स्थापित किया, तो मुझे थोड़ा अलग कोड, कभी-कभी संकलन और कभी-कभी नहीं, एक ही समस्या थी। मैं जैसे रूपों की कोशिश की:

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

लेकिन XE2 संकलक, फ़ाइल नहीं मिली की जा रही है, तो वास्तव में यह वहाँ नहीं था (ध्यान दें कि यह मेरी प्रारंभिक निर्माण किया गया था) आरईएस के बारे में शिकायत रखा।

यह पता चला आप पहले सीधे कार्यक्रम बयान नीचे है कि लाइन लगाने की आवश्यकता:

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

... और नहीं अपने के आसपास के क्षेत्र में पहले से ही मौजूद

{$R *.res} 

फिर आप पर अपना प्रोग्राम बनाते हैं।

उसके बाद आप एक अधिक तार्किक जगह पर वापस लाइन स्थानांतरित कर सकते हैं:

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

कुछ अजीब कारण के लिए, एक बार डेल्फी 'जानता है कि आर सी फ़ाइल परियोजना का हिस्सा है, यह अब मायने रखती है अगर आप या तो:

  • जगह कहीं और लाइन
  • एक .res वर्तमान फ़ाइल या नहीं

एक प्रीकंपाइल चरण की कोई ज़रूरत नहीं है। यदि आरसी फ़ाइल संशोधित की गई है, तो कंपाइलर .RES फ़ाइल का पुनर्निर्माण करेगा, चाहे कोई पुराना संस्करण मौजूद था या नहीं।

यह अजीब व्यवहार वास्तव में मदद नहीं करता है जब आप शुरू में ;-(इस प्रणाली की स्थापना की

वहाँ अन्य अजीब परियोजना स्रोत की पार्स करने और .dproj फ़ाइल के निर्माण के साथ चल रहा है चीजें हैं जो मुझे इस समाधान में लाया, विशेष रूप से:

यदि आप .rc फ़ाइल का नाम बदलते हैं, तो यह आपको फिर से परेशानी में डाल सकता है: .dproj फ़ाइल में अवशेष अभी भी पुराने .rc फ़ाइल को इंगित कर रहे हैं और संकलक शिकायत करेगा इसे खोजने के बारे में नहीं। आपको इसे ठीक करने के लिए .dproj फ़ाइल से इस पुराने नाम को संपादित करना होगा।

नोट यह सभी संस्करण YMMV के तहत XE2 के तहत था।


संपादित जोड़ने के लिए: आप अभी भी XE2 Version Info Not Working मुद्दे के साथ लड़ाई के लिए हो सकता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^