2013-01-10 15 views
5

मैं गिट-एसवीएन का उपयोग कर रहा हूं और मैं अपने आईओएस ऐप में अपना संशोधन नंबर एम्बेड करने की कोशिश कर रहा हूं। फिलहाल, मैं एक निर्माण चरण है जो निम्न स्क्रिप्ट चलाता है:मैं अपने स्रोत के पेड़ को गंदे किए बिना अपने ऐप के बिल्ड नंबर को गतिशील रूप से कैसे सेट कर सकता हूं?

SVN_REVISION=$(git svn find-rev HEAD) 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $SVN_REVISION" "$INFOPLIST_FILE" 

इस के साथ समस्या यह है कि, के बाद से रेपो हमेशा पिछले संशोधन होता है, स्क्रिप्ट हमेशा मेरे Info.plist गंदा बनाता है।

क्या यह संभव है मुझे गतिशील रूप से मेरे स्रोत पेड़ dirtying बिना मेरे ऐप की बिल्ड नंबर सेट करने के लिए के लिए?

उत्तर

8

1) "एग्रीगेट" प्रकार की अपनी परियोजना में एक नया लक्ष्य जोड़ें, उदा। आप इसे "Info Info.plist उपसर्ग शीर्षलेख अपडेट करें" नाम दे सकते हैं; बस संवाद में "उत्पाद का नाम" के रूप में उपयोग करें।

2) एक रन स्क्रिप्ट चरण का निर्माण इस नए लक्ष्य के लिए निम्न स्रोत कोड के साथ जोड़ें:, नाम

#!/bin/sh 
SVN_REVISION=$(git svn find-rev HEAD) 
echo "#define SVN_REVISION $SVN_REVISION" > "$SCRIPT_OUTPUT_FILE_0" 


3) अपनी स्क्रिप्ट के लिए कोई आउटपुट फ़ाइल जोड़े यह

$(CONFIGURATION_TEMP_DIR)/InfoPlist.pch 


4) अपने आईओएस ऐप के बिल्ड चरण खोलें।

5) कुल लक्ष्य आप के रूप में निर्भर लक्ष्य से पहले बनाए गए जोड़ें (इसे जोड़ने के लिए "लक्ष्य निर्भरता")। इसका अर्थ यह है कि एक्सकोड हमेशा आपके लक्ष्य को बनाए रखने से पहले इस लक्ष्य को बनाएगा।

6) अपने आईओएस ऐप की बिल्ड सेटिंग्स खोलें।

7) सेटिंग "Info.plist प्रीप्रोसेसर उपसर्ग फ़ाइल" के लिए खोजें और इसे बदलने के लिए ठीक उसी मूल्य चरण में आउटपुट फ़ाइल के लिए इस्तेमाल किया (3)।

8) सेटिंग "preprocess Info.plist फ़ाइल" के लिए खोज और यकीन है कि यह सक्षम है।

9) अपने वर्तमान Info.plist फ़ाइल खोलें और SVN_REVISION को CFBundleVersion का मूल्य बदल जाते हैं। $ (SVN_REVISION) या $ {SVN_REVISION} का उपयोग न करें; यह कोई बिल्ड सेटिंग या पर्यावरण परिवर्तनीय प्रतिस्थापन नहीं है, यह एक प्रीप्रोसेसर प्रतिस्थापन है, इसलिए बस SVN_REVISION का उपयोग करें।


यह है कि। प्रत्येक बार जब आप अपना आईओएस ऐप बनाते हैं, तो एक्सकोड पहले कुल लक्ष्य बनाता है, जो पीसीएच फ़ाइल को अपडेट करता है, और जब यह आपके आईओएस ऐप बनाता है, तो यह सी प्री-प्रोसेसर के माध्यम से Info.plist फ़ाइल चलाएगा (पीएचसी फाइल का उपयोग उपसर्ग के रूप में हेडर) इसे अपने एप्लिकेशन पर कॉपी करने से पहले। प्री-प्रोसेसर SVN_REVISION को प्रतिस्थापित करेगा क्योंकि इसे आपकी पीसीएच फ़ाइल में मैक्रो के रूप में परिभाषित किया गया है।

महत्वपूर्ण सूचनाएं

कुछ लोगों को लगता है कि यह $(DERIVED_FILE_DIR) बजाय $(CONFIGURATION_TEMP_DIR) उपयोग करने के लिए एक बेहतर विचार है। खैर, सिद्धांत रूप में वे सही हैं, फिर भी अभ्यास में केवल एक समस्या है: व्युत्पन्न फ़ाइल डीआईआर प्रत्येक लक्ष्य के लिए अलग है, जबकि कॉन्फ़िगरेशन temp dir एक जैसा है (यह प्रत्येक बिल्ड कॉन्फ़िगरेशन के लिए केवल अलग है)। व्युत्पन्न फ़ाइल डीआईआर का उपयोग करते समय, पीसीएच फ़ाइल कुल लक्ष्य के व्युत्पन्न फ़ाइल डीआईआर पर लिखी जाती है, फिर भी जब आईओएस ऐप का निर्माण होता है, तो एक्सकोड आईओएस ऐप के व्युत्पन्न फाइल डीआईआर में इस फाइल को खोजेगा और इस प्रकार यह नहीं मिलेगा फ़ाइल।

कुछ लोग यह भी सोच सकते हैं कि रन स्क्रिप्ट चरण को जोड़ने का बेहतर विचार है जो इसके लिए एक अलग लक्ष्य बनाने के बजाय आपके आईओएस ऐप के पहले निर्माण चरण के रूप में उपसर्ग शीर्षलेख अपडेट करता है (यह व्युत्पन्न भी हल करेगा उपरोक्त वर्णित फाइल डीआईआर मुद्दा)। फिर, सिद्धांत में अच्छा विचार है लेकिन अभ्यास में काम नहीं कर सकता है: यदि प्रीप्रोसेसिंग का अनुरोध किया जाता है, तो पहले स्क्रिप्ट चरण को पहले से निष्पादित करने से पहले Info.plist प्रीप्रोसेस्ड किया जाता है, इसलिए यदि पीसीएच फ़ाइल पहले से मौजूद नहीं है या पहले ही अपडेट नहीं हुई है, तो या तो एक त्रुटि के साथ समाप्त होता है या पुराने एसवीएन संशोधन प्लिस्ट फ़ाइल में लिखा जाता है। यही कारण है कि आपको इस कार्य के लिए एक अलग लक्ष्य की आवश्यकता है जो आपके वास्तविक लक्ष्य से पहले निर्माण करने की गारंटी है।

2

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

SCRIPT_OUTPUT_FILE_0="$CONFIGURATION_TEMP_DIR/InfoPlist.pch" 

गयी। साथ ही मूल plist भी निर्माण कदम में नए मूल्यों को कॉपी करने के लिए आदेश में छुआ जाना चाहिए, तो मैं भी पिछले आउटपुट फ़ाइल घोषणा के बाद

`touch $SCRIPT_INPUT_FILE_0` 

गयी। यह स्पर्श ऑपरेशन गिट को परिवर्तन-सक्षम के रूप में परिवर्तन का पता नहीं लगाता है।

चीयर्स

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

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