2009-09-13 22 views
14

में बिल्ड नंबर की स्वचालित वृद्धि, मैं सी ++ स्रोत में एक चर (या #define) रखना चाहता हूं जो प्रत्येक बार जब मैं स्रोत कोड बनाने के लिए क्यूटी निर्माता का उपयोग करता हूं तो वृद्धि होगी। क्या मैं ऐसा कर सकता हूं, शायद कुछ क्यूटी निर्माता प्लगइन या इसी तरह? अगर ऐसा करने का कोई तरीका है तो क्या मैं कमांड लाइन बनाने के लिए "मेक" का उपयोग करता हूं?क्यूटी निर्माता

उत्तर

16

अपनी .pro फ़ाइल में, आप एक वेरिएबल बना सकते हैं जिसमें कमांड लाइन प्रोग्राम के परिणाम शामिल हैं। फिर आप इसे परिभाषित करने के लिए उपयोग कर सकते हैं।

BUILDNO = $$(command_to_get_the_build_number) 
DEFINES += BUILD=$${BUILDNO} 

आप सिर्फ एक सरल incrementing संख्या चाहते हैं, आप एक बहुत सरल स्क्रिप्ट का उपयोग कर सकते हैं:

#!/bin/bash 
number=`cat build_number` 
let number += 1 
echo "$number" | tee build_number #<-- output and save the number back to file 

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

+1

मैं वास्तव में प्रत्येक निर्माण पर वृद्धि चाहता हूं जो प्रत्येक भंडार प्रतिबद्ध नहीं है। यह मेरे प्रश्न का उत्तर देता है। – Ross

+0

मैं क्यूटी + क्यूमेक के साथ अपनी योजना का उपयोग कर रहा हूं: http://indiocolifax86.wordpress.com/2010/05/22/a-checheme-for-automatic-build-numbers-in-cc-projects/ –

+2

सेक्सी .bat संस्करण :) बंद @echo सेट/p var = < सेट ver.txt/एक var =% वर% + 1 गूंज% वर%> ver.txt (बस के साथ ver.txt बनाने 0 में 0) – argh

4

कालेब का सुझाव बहुत अच्छा है, लेकिन मेरे मामले में "बॉक्स से बाहर" काम नहीं किया। मुझे इसके बजाय कुछ त्रुटियां मिलीं और उन्हें ठीक करने के लिए कुछ पढ़ना पड़ा। परिवर्तन बहुत मामूली हैं। मैं उबंटू लिनक्स पर क्यूटी 4.7 का उपयोग कर रहा था ... पहला परिवर्तन, यदि आप इसे विश्वास कर सकते हैं, तो let number += 1 से let number++ पर जाने के लिए शेल स्क्रिप्ट में था ... मैं आमतौर पर विंडोज़ का उपयोग/प्रोग्राम करता हूं, इसलिए मैं इसे समझा नहीं सकता, लेकिन जब मैं मूल मामले में कमांड लाइन (शेल प्रॉम्प्ट) से स्क्रिप्ट चलाता हूं तो मुझे त्रुटियों की सूचना मिलती है, बदले गए मामले में सभी अच्छी तरह से बढ़ते हैं और बढ़ती संख्याएं वापस आती हैं ...

चूंकि इसे पूरी तरह से कालेब द्वारा रिपोर्ट नहीं किया गया है - मैंने शेल स्क्रिप्ट के नाम के रूप में build_number.sh का उपयोग किया और build_number नाम के साथ एक और फ़ाइल बनाई (.sh के बिना) और केवल एक शून्य डालें, और कुछ नहीं।

अंतिम और सबसे अप्रिय बग Q12 प्रोजेक्ट फ़ाइल में BUILDNO = $$system(./build_number.sh) के साथ को प्रतिस्थापित करके तय किया गया था। $$ के बाद और फ़ाइल नाम के सामने आवश्यक ./ पर ध्यान दें। बाद में एक नियमित लिनक्स उपयोगकर्ता के लिए प्राथमिक है, लेकिन विंडोज उपयोगकर्ता के लिए उतना ही नहीं।

आशा है कि यह मेरे जैसे लोगों के लिए यह सब सीधे नए लोगों के लिए आगे बढ़ेगा। आप क्यूटी डिजाइनर सहायता अनुभाग में और अधिक पढ़ सकते हैं यदि आप qmake के लिए प्रयास करते हैं, समारोह संदर्भ, उन्नत उपयोग आदि

ओह, एक अंतिम शब्द ... मैं भी DEFINES += BUILD=$${BUILDNO} को DEFINES += -DBUILD=$${BUILDNO} बदलना पड़ा, तो -D है सहित गया हुआ। अपने सी ++ कोड के अंदर आप BUILD का उपयोग करेंगे जैसे कि आपने अपनी फ़ाइल के शीर्ष पर #define BUILD 1234 लिखा था।

+0

यह '-D' के बारे में एक अच्छा नोट है। मैं इसे ठीक करने के लिए अपना जवाब संपादित करूंगा। –

+2

कुछ परीक्षणों के बाद यह अब स्पष्ट है कि यह समाधान सही नहीं है क्योंकि कई मामलों में qmake चरण को बिल्ड के दौरान निष्पादित नहीं किया गया है क्योंकि "कॉन्फ़िगरेशन नहीं बदला गया है"। qmake मेकफ़ाइल बनाता है जिसका उपयोग अनुप्रयोग बनाने के लिए किया जाता है और इसके लिए यह भी * .pro फ़ाइल में लिखा गया है, लेकिन केवल एक बार व्याख्या करता है। मेकफ़ाइल में हमें बिल्ड बिल्ड_number.sh के बजाय -DBUILD 29 मिलते हैं ... मेकफ़ाइल में कुछ लिखना कोई समाधान नहीं है क्योंकि यह qmake निष्पादित होने पर ओवरराइट किया जाता है। आप डिज़ाइनर/बिल्ड मेनू से qmake निष्पादित कर सकते हैं, लेकिन यह स्वचालित नहीं है। समाधान की जरूरत है! –

6

जैसा कि मैंने कुछ परीक्षणों के बाद पहले लिखा था, मैंने पाया कि मूल समाधान में कोई समस्या है क्योंकि प्रत्येक बार जब कोई नया निर्माण किया जाता है तो संस्करण संख्या अद्यतन नहीं होती है। कई मामलों में मैंने एक स्रोत फ़ाइल संपादित की थी, बिल्ड चलाया था, लेकिन फिर भी एक ही बिल्ड नंबर मिला ... बिल्डिंग प्रक्रिया ने अभी फैसला किया कि कुछ भी नहीं बदला गया था और उस चरण को छोड़ दिया गया था जो बिल्ड नंबर को अपडेट करता। मैंने पहले उस कदम को मजबूर करने का एक तरीका खोजने का प्रयास किया, लेकिन इसे समझ नहीं पाया। अंत में मैंने एक अलग रास्ता तय करने का फैसला किया। अब मैं हेडर फ़ाइल build_number.h जेनरेट करने के लिए स्क्रिप्ट का उपयोग करता हूं जिसमें #define BUILD है जो अपडेट किए गए नंबर के पीछे है।

#!/bin/bash 
number=`cat build_number` 
let number++ 
echo "$number" | tee build_number #<-- output and save the number back to file 
echo "#define BUILD ""$number" | tee ../MyProject/build_number.h 

incrementing संख्या अभी भी build_number नामक एक फ़ाइल में संग्रहीत किया जाता है: तो Calebs स्क्रिप्ट अब थोड़ा संशोधित (build_number.sh) है।मैं संख्या के लिए जेनरेट की गई हेडर-फ़ाइल को पार्स करके एक तीसरी फ़ाइल से बचा सकता था, लेकिन इसके खिलाफ फैसला किया। ध्यान दें कि स्क्रिप्ट और जेनरेटेड हेडर प्रोजेक्ट निर्देशिका में स्थित हैं जबकि build_number फ़ाइल बिल्ड निर्देशिका में है। यह सही नहीं है, लेकिन मैं इसके साथ रह सकता हूं।

चीजों को एक साथ रखने के लिए अब कुछ और चीजें हैं। सबसे पहले जेनरेट की गई हेडर-फ़ाइल को क्यूटी डिज़ाइनर में प्रोजेक्ट में जोड़ा जाना आवश्यक है ... शीर्षलेख-फ़ाइलें पर राइट-क्लिक करें और "मौजूदा फ़ाइल जोड़ें" पर राइट-क्लिक करें। दूसरा, इसे सी ++ - फ़ाइल में शामिल किया जाना है जहां BUILD परिभाषित किया गया है ... #include "build_number.h" ... और अंतिम लेकिन कम से कम कुछ अतिरिक्त परियोजना प्रोजेक्ट फ़ाइल (MyProject.pro) में नहीं किए जाने चाहिए। नोट मैं Calebs समाधान से सामान नष्ट कर दिया है, तो हम यहाँ सिरे से शुरू:

build_nr.commands = ../MyProject/build_number.sh 
build_nr.depends = FORCE 
QMAKE_EXTRA_TARGETS += build_nr 
PRE_TARGETDEPS += build_nr 

ये लाइनें (मैं उन्हें हेडर अनुभाग से पहले डाल) स्क्रिप्ट के निष्पादन, जो build_number से पिछले बिल्ड नंबर पढ़ता मजबूर , इसे बढ़ाता है, इसे वापस लिखता है और build_number.h फ़ाइल का अद्यतन संस्करण भी उत्पन्न करता है। चूंकि यह प्रोजेक्ट के स्रोत का हिस्सा है, इसलिए हर बार कोड में नए मान को लिंक किया जाता है।

उल्लेख करने की एक बात है - अब बिल्डिंग प्रक्रिया कभी राय नहीं है कि कुछ भी नहीं बदला है। इसलिए यदि आप अपना कोड अपरिवर्तित छोड़ देते हैं तो एक नया संस्करण बनाने से एक नया संस्करण संख्या उत्पन्न होगी और एक नई बाइनरी बन जाएगी। पुराने समाधान ने कोड बदलते समय नंबर छोड़ा, यह नया समाधान एक नए निर्माण को मजबूर करता है जब स्रोत अपरिवर्तित होता है, क्योंकि मैं उस हेडर फ़ाइल में बदलाव को मजबूर करता हूं। किसी ने बीच में कुछ पसंद किया होगा, लेकिन हेडर केवल एक ही स्थान पर शामिल है क्योंकि पुनर्निर्माण बहुत तेज है और इससे ज्यादा नुकसान नहीं होता है। लेकिन फिर भी, अगर कोई जानता है कि दोनों दुनिया के सर्वश्रेष्ठ कैसे प्राप्त करें, तो कृपया सलाह दें। कम से कम अब मेरे पास एक ही संस्करण संख्या के साथ दो अलग-अलग बाइनरी नहीं होंगी।

6

जॉर्ज Beutel का बेहतर समाधान https://stackoverflow.com/a/5967447/1619432 के लिए Windows बराबर:

.pro:

build_nr.commands = build_inc.bat 
build_nr.depends = FORCE 
QMAKE_EXTRA_TARGETS += build_nr 
PRE_TARGETDEPS += build_nr 

HEADERS += build.h 

build_inc.bat:

@echo off 
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt 
echo #define BUILD %var% >build.h 
echo %var% 

प्रयोग

#include "build.h" 
... 
qDebug() << "Build number:" << BUILD; 
+0

कुछ और अधिक परिष्कृत समावेशन के लिए http://qtcreator.blogspot.de/2009/10/generating-automatic-version-numbers.html भी देखें (हेडर फ़ाइल उत्पन्न करने के लिए एक कस्टम प्रोग्राम का उपयोग करके)। – handle

-1

मेरे द्वारा अब तक देखे गए सभी समाधानों को मेरे स्वाद के लिए अत्यधिक संकुचित किया गया है। मैंने एक बहुत ही सरल समाधान पकाया है जो QtCreator के भीतर सीधे क्रॉस प्लेटफॉर्म का काम करता है। http://refaqtory.net/blog/?p=34

+0

वह लिंक टूटा हुआ है। – CodeLurker

1

यहां Win7 के लिए एक समाधान है, मैं handle's solution पर आधारित था। यह समाधान विंडोज़ को यर संस्करण # देता है जब आप यार लक्ष्य पर राइट-क्लिक करते हैं, और गुण चुनें। विवरण। यह Win7, और शायद सबसे पुराने संस्करणों में काम करता है।

ठीक है, आप yer build_inc.bat बनाने:

@echo off 
copy /b myapp.rc +,, 
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt 
echo #define BUILD %var% >build.h 

और yer proj फ़ोल्डर में रख दें। (copy /b myapp.rc +,, फ़ाइल के टाइम-स्टैम्प को अपडेट करने के लिए "स्पर्श" के लिए माइक्रोसॉफ्ट-ईज़ को अचूक है।) अब तक, इतना अच्छा - तो क्या? !!

यह हिस्सा वैकल्पिक है, यदि आपको बाइनरी में एन्कोड किए गए संस्करण की आवश्यकता नहीं है। एक। आरसी फ़ाइल बनाएँ, उदा।:

#include "build.h" 

1 VERSIONINFO 
FILEFLAGS 32 
FILEVERSION 1, 0, BUILD, 0 
PRODUCTVERSION 1, 0, BUILD, 0 
FILEOS 4 
FILETYPE 1 

{ 
    BLOCK "StringFileInfo" 
    { 
     BLOCK "040904B0" 
     { 
      VALUE "FileDescription", "program" 
      VALUE "OriginalFilename", "program.exe" 
      VALUE "CompanyName", "you" 
      VALUE "FileVersion", "Release" 
      VALUE "LegalCopyright", "Copyright (c) 2016, you, fool!" 
      VALUE "ProductName", "Yer proggie" 
      VALUE "ProductVersion", "Release" 
     } 
    } 
    BLOCK "VarFileInfo" 
    { 
     VALUE "Translation", 0x0409, 0x04B0 
    } 
} 

एक और अधिक पूर्ण विकसित संस्करण यहाँ उपलब्ध है: Versioning DLLs। बीटीडब्लू: यह VarFileInfo ब्लॉक के बिना काम नहीं करेगा। यह। आरसी का उपयोग राइट-क्लिक करने और गुणों में यह जानकारी प्राप्त करने जैसी सामग्री के लिए किया जाता है विवरण। मेरे पास इस जानकारी और ऐप आइकन के लिए एक एम $ .rc फ़ाइल है, और संसाधनों के तहत क्यूटी निर्माता में अन्य संसाधन जोड़ें।

इतना आसान नहीं है: यहां वह हिस्सा है जिसे मैंने खोजने के लिए कुछ समय लगाया है। क्यूटी निर्माता में, यार प्रोज खोले जाने के साथ, छोटे कंप्यूटर आइकन पर क्लिक करें और इसे रिलीज़ मोड में रखें। "परियोजनाओं" पर क्लिक करें। "बिल्ड बिल्ड जोड़ें" पर क्लिक करें, कस्टम प्रक्रिया चरण चुनें, और टोपी आइकन "^" पर क्लिक करें जब तक कि यह सूची के शीर्ष पर न हो। मान लें कि आपने yer .rc, "myapp.rc" नाम दिया है। था निर्माण कदम इस प्रकार पढ़ा बनाओ: एक qmake आधारित संस्करण कमांड लाइन या कमांड लाइन उपकरण एक IDE से कहा जाता क्यूटी निर्माता में, से अच्छी तरह से काम कर सकते हैं

Command: cmd.exe 
Arguments:/c build_inc.bat 
Working Directory: %{CurrentProject:Path} 

, वहीं निर्माण चरणों बेहतर हैं, मेरा मानना ​​है। क्यूटी निर्माता वास्तव में प्रत्येक निर्माण के लिए qmake नहीं चलाता है; लेकिन कदम निर्माण हर निर्माण चला रहे हैं। इसके अलावा

RC_FILE += myapp.rc 

, yer proj को myapp.rc जोड़ें:

अब, yer .pro फ़ाइल में जोड़ना। यह "अन्य फाइलों" के तहत दिखाई देगा।

अब पुनर्निर्माण करें। प्रत्येक पुनर्निर्माण संसाधन फ़ाइल का स्पर्श ट्रिगर करेगा, जिससे हर बार "आरसी" चल रहा है। अन्यथा, बिल्ड नंबर बाइनरी दाएं में एन्कोड नहीं किया जाएगा। यह मेरे लिए जल्दी से चलता है। प्रत्येक पुनर्निर्माण इस संख्या में वृद्धि करेगा। मैंने उन्हें "रिलीज" निर्माण में जोड़ने के लिए केवल परेशान किया है; इसलिए डीबग बिल्ड इस में वृद्धि नहीं करते हैं। वे सिर्फ अंतिम निर्माण की संख्या का उपयोग करेंगे। मुझे विश्वास है कि एक त्रुटि से बचने के लिए आपको रिलीज में इसे चलाने की आवश्यकता होगी, मुझे विश्वास है। यह Qt निर्माता में प्रत्येक बार अलग-अलग qmake को फिर से चलाने के बिना काम करता है; और आपको प्रत्येक बार एक अलग बिल्ड नंबर देता है। यह किसी भी अन्य recompiles ट्रिगर नहीं करता है। आपके पास "आरसी" चलाने और हर बार जोड़ने का ओवरहेड है, क्योंकि सबकुछ अद्यतित होने पर कुछ भी करने के विपरीत नहीं है; लेकिन ओटीओएच, मैं इसे रिलीज के लिए करता हूं केवल बनाता है; आप लगभग किसी भी निर्माण या चलाने के लिए हमेशा लिंक करते हैं; और फिर, "आरसी" तेज है।

वैकल्पिक: आप जहां भी चाहते हैं वहां आप BUILD प्रीप्रोसेसर प्रतीक को स्थानांतरित कर सकते हैं। #। (नोट: आप भी कुछ इस तरह के साथ yer एप्लिकेशन आइकन जोड़ सकते हैं:।

IDI_ICON1 ICON DISCARDABLE "Icons/myicon.ico" 

यह एक्सप्लोरर में दिखाने से पहले ही फ़ाइल चलाया जाता है बनाता है)

तुम भी "build.h" जोड़ सकते हैं क्यूटी निर्माता में औपचारिक रूप से प्रोजेक्ट करने के लिए, इसे उस फ़ाइल में शामिल करें जिसे आप बिल्ड # का उपयोग करना चाहते हैं, और इसे स्ट्रिंग के रूप में उपयोग करें, उदाहरण के लिए साथ:

#include <QDebug> 
#include "build.h" 

#define STR_EXPAND(tok) #tok 
#define STR(tok) STR_EXPAND(tok) 

qDebug() << QString("(build ")+STR(BUILD)+")"; 

मैं सिर्फ एक पक्ष प्रभाव देखा: आप इसे इस तरह से करते हैं, तो यह रिलीज में हर चलने से पहले पुनर्निर्माण करेंगे। मुझे लगता है कि भुगतान करने के लिए बहुत बुरा नहीं है। मुझे लगता है कि मैं हमेशा रनटाइम को रिलीज निर्देशिका में कॉपी कर सकता हूं, और इसे एक्सप्लोरर से चला सकता हूं; या बस मेरे आरएच के अतिरिक्त संकलन, "आरसी" के रन और रिलीज में प्रत्येक रन के साथ लिंक के साथ रखो। उस मामले के लिए, मैं इसे कीबोर्ड शॉर्टकट के साथ चलाने के लिए सिर्फ एक बाहरी उपकरण बना सकता था। मैं निश्चित रूप से इस पर किसी भी सुधार के लिए खुला हूँ। समय के लिए, मैं परेशान नहीं हूं, बस "about.cpp" को संकलित करने के रूप में, "आरसी" चला रहा हूं और प्रत्येक रन से जोड़ने में बहुत लंबा समय नहीं लगता है। फिर भी, लोग: स्वत: निर्माण संख्या!

☮!

संपादित करें: वैकल्पिक: जब आप अपनी परियोजना का निर्माण या पुनर्निर्माण करते हैं तो बिल्ड नंबर को बढ़ाने के लिए, लेकिन जब आप इसे चलाते हैं तो नहीं (भले ही कोई बिल्ड रिलीज में हमेशा होता है), परियोजनाओं पर जाएं। बिल्ड और रन | भागो, क्लिक करें "एक तैनात चरण जोड़ें" और "कस्टम प्रक्रिया चरण":

Command: cmd.exe 
Arguments: /c if exist build.old copy /y build.old build.txt 
Working Directory: %{CurrentProject:Path} 

फिर, .bat फ़ाइल में @echo के बाद

copy /y build.txt build.old 

जोड़ने बंद। यह भी संभव है, कस्टम कस्टम प्रोजेक्ट टेम्पलेट्स बनाने के लिए, हालांकि Extending Qt Creator Manual

संपादित करें: मैंने अब इसे दो, कस्टम बिल्ड चरणों के साथ काम नहीं किया है।

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