2012-11-10 11 views
5

मैं अपने प्रोजेक्ट में निर्माण चरण के रूप में इस का उपयोग कर रहा:निर्माण पर डीएसवाईएम में CFBundleShortVersionString अद्यतन करें?

export PLISTBUDDY="/usr/libexec/PlistBuddy" 

export INFO="${CODESIGNING_FOLDER_PATH}/Info.plist" 
export RXREVISION=`git describe --tags | perl -pi -E "s/[^-]+\-([^-]+).*/\1/"` 
export RXVERSION=`git describe --tags | perl -pi -E "s/([^-]+)\-[^-]+.*/\1/"` 
$PLISTBUDDY $INFO -c "add CFBundleVersion string $RXREVISION" 
$PLISTBUDDY $INFO -c "set :CFBundleVersion $RXREVISION" 
$PLISTBUDDY $INFO -c "add CFBundleShortVersionString string $RXVERSION" 
$PLISTBUDDY $INFO -c "set :CFBundleShortVersionString $RXVERSION" 

यह बनाया आवेदन के Info.plist में निर्माण संशोधन अद्यतन करने के लिए पूरी तरह से काम करता है, और यह मेरी स्रोत पेड़ उत्परिवर्तित नहीं है।

मैंने अंत में और लिंक चरण से पहले भी अपनी अद्यतन संस्करण स्क्रिप्ट डालने का प्रयास किया है। किसी भी तरह से, यह निर्मित अनुप्रयोग में परिवर्तन को प्रभावित करने में सक्षम है, लेकिन डीएसवाईएम मूल स्रोत पेड़ से बनाया गया है।

बिल्ट ऐप और निर्मित डीएसवाईएम के बीच संस्करण संख्याओं का यह मिलान एक समस्या है। (हॉकी ऐप यहां एक त्रुटि फेंकता है।)

अगर मैं अपने स्रोत पेड़ में Info.plist को अपडेट करता हूं, तो मुझे इसे बदलने से निपटने की ज़रूरत है। जो मुझे दो विकल्प छोड़ देता है जो मैं देख सकता हूं:

  1. स्रोत नियंत्रण के तहत Info.plist रखें, और स्क्रिप्ट को इसे सीधे संपादित करें। लेकिन इसका मतलब है कि मुझे प्रत्येक निर्माण के बाद परिवर्तनों की जांच करनी होगी।
  2. Info.plist को अनदेखा करें, और स्क्रिप्ट को इसे सीधे संपादित करें। लेकिन Info.plist में कई अन्य चीजें हैं जो मैं स्रोत नियंत्रण के तहत चाहता हूं।

मैं अपने स्रोत पेड़ में Info.plist से निपटने के बिना स्वचालित रूप से अद्यतन करने के बिना डीएसवाईएम में संस्करण कैसे प्राप्त कर सकता हूं?

इसके अलावा, स्पर्शकीय रूप से: मैं डीएसवाईएम में संस्करण कैसे देखूं?

+0

मैं शायद कुछ लेकिन तुच्छ समाधान के बारे में मैं dSYM निर्देशिका हटा रहा है वहाँ अगर कुछ इसके साथ गलत सोच रहा हूँ याद आ रही है। यदि आप डिबगिंग प्रतीकों के साथ निर्माण कर रहे हैं, तो इसे फिर भी बनाया जाएगा। –

+0

जब तक मैं बिल्ड को स्रोत पेड़ को म्यूटेट नहीं करता, डीएसवाईएम को हटाने और पुनर्निर्माण करने के लिए केवल गलत सीएफबींडलशॉर्टवर्सनस्ट्रिंग के साथ डीएसवाईएम का पुनर्निर्माण किया जाएगा। मैं चाहता हूं कि निर्माण किसी भी स्रोत को गठबंधन न करें। (जाहिर है, मैं जो भी उत्परिवर्तन करता हूं * मुझे * यह करने की ज़रूरत है और यह काम करने के लिए इसे जांचें, सिर्फ प्रति निर्माण नहीं।) –

+0

आपके निर्माण चरणों का निष्पादन आदेश क्या है? कस्टम चरण कब निष्पादित करता है? – Felix

उत्तर

1

डीएसवाईएम पैकेज में एक समान जानकारी वाले रूट फ़ोल्डर में एक info.plist भी है। आप शायद उसी तरह भी इसे संशोधित कर सकते हैं।

एक और विकल्प संस्करण संख्या को अतिरिक्त .xcconfig फ़ाइल में परिभाषित करना है और इसमें info.plist से संस्करण संख्या शामिल है, here देखें।

फिर आप यह भी तय कर सकता है वर्ज़निंग आप किस प्रकार की चाहते हैं या जारी या परीक्षण, बनाता है कई अलग-अलग info.plist फ़ाइलों का उपयोग और निर्माण सेटिंग में विभिन्न .xcconfig फ़ाइलों को संदर्भित और परीक्षण के लिए एक शामिल नहीं हैं स्रोत नियंत्रण में बनाता है ।

सामान्य रूप से मैं सुझाव देता हूं कि प्रत्येक संस्करण में बदलाव के लिए प्रतिबद्ध रहें, क्योंकि इससे कोड वास्तव में पुन: उत्पन्न होता है और स्रोत नियंत्रण प्रणाली में विशिष्ट रूप से इसकी पहचान भी करता है।

इसके अलावा, ऐप्पल CFBundleVersion को "एक या अधिक अवधि से अलग पूर्णांक वाले" में एक "एकान्त रूप से बढ़ी हुई स्ट्रिंग" सेट करने के लिए निर्दिष्ट करता है, here देखें। CFBundleShortVersionString आपका मार्केटिंग संस्करण है, उदा। आपका लक्ष्य संस्करण 3.0 पर काम करना है।

तो कैसे एक रिलीज के निर्माण के लिए निम्न कार्य के बारे में: टैग कि रिहाई के लिए प्रतिबद्ध नया बिल्ड नंबर और 3.0 Beta 1 जैसे नए विपणन संस्करण के साथ CFBundleShortVersion साथ अद्यतन CFBundleVersion और उन दोनों के लिए प्रतिबद्ध है और फिर। संस्करण संख्या आपके स्रोत का हिस्सा किसी भी अन्य मेटा डेटा की तरह हैं, खासकर अगर संस्करण संख्या का उपयोग संगतता, डेटाबेस उन्नयन या अन्य चीजों (जो अक्सर किया जाता है) के लिए विशिष्ट कोड को ट्रिगर करने के लिए भी किया जाता है।

+0

मैं वास्तव में क्या करता हूं वह गिट टैग से संस्करण खींचता है। तो संस्करण स्रोत नियंत्रण में है, यह मुख्य डेटा के बजाय मेटाडेटा का हिस्सा है। वैसे भी: मैं सिर्फ Info.plist में चाबियाँ नहीं देख रहा था। धन्यवाद! –

4

स्वीकृत उत्तर सही है, लेकिन dsym के लिए plist को संशोधित करने के बारे में वास्तविक विवरण नहीं देता है। निम्नलिखित लाइनों का निर्माण स्क्रिप्ट को संशोधित करता जोड़ना dsym में plist: के लिए "Git से CFBundleVersion सेट" पूर्ण स्क्रिप्ट का निर्माण

cd "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app.dSYM/Contents" 
$PLISTBUDDY -c "Set CFBundleVersion $RXREVISION" Info.plist 
+0

'$ DWARF_DSYM_FOLDER_PATH/$ DWARF_DSYM_FILE_NAME/सामग्री/Info.plist" का उपयोग करके भविष्य में सबूत हो सकता है। –

1

यहाँ है चरण मैं उपयोग कर रहा हूँ:

APP_INFO_PLIST="${TARGET_BUILD_DIR}/${INFOPLIST_PATH}" 
DSYM_INFO_PLIST="${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist" 

BUILD_NUMBER=`git rev-list HEAD --count` 

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$APP_INFO_PLIST" 
if [ -f "$DSYM_INFO_PLIST" ] ; then 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$DSYM_INFO_PLIST" 
fi 

(नोट यह Xcode 6.)

+0

मेरे लिए xcode 7 में काम नहीं कर रहा है "कॉपी बंडल संसाधन" के बाद चल रहा है। अस्तित्व की जांच पास हो जाती है, फिर भी मुझे अभी भी एक्सकोड के माध्यम से एक परीक्षण डिवाइस पर ऐप को तैनात करने का प्रयास करते समय त्रुटि नहीं पढ़ सकती है। मुझे कोई अन्य सेटिंग्स देखना चाहिए? – lostintranslation

+0

@lostintranslation इस चरण या एक्सकोड 7 से कोई संबंध होने की संभावना नहीं है। –

0

मैं एक स्क्रिप्ट है कि मैं किसी भी Xcode प्रोजेक्ट फ़ोल्डर में छोड़ और एक रन स्क्रिप्ट से कॉल जो अनुप्रयोग के लिए Info.plist अपडेट हो जाएगी और कर सकते हैं बनाया में "कॉपी बंडल संसाधन" के बाद चलाना चाहिए डीएसवाईएम ताकि निर्माण हो संख्या मैच इसके बाद इसे हॉकीएप और आईट्यून्स कनेक्ट टेस्टफलाइट और ऐप स्टोर जैसी सेवाओं पर अपलोड किया जा सकता है।

मैं एक्सकोड की रन स्क्रिप्ट के बाहर स्क्रिप्ट को प्रबंधित करना पसंद करता हूं क्योंकि मैं इसे अधिक आसानी से संपादित कर सकता हूं और प्रोजेक्ट फ़ाइल की सामग्री को बहुत छोटा रख सकता हूं। मैं प्रोजेक्ट फ़ाइल के स्वतंत्र रूप से स्क्रिप्ट को स्क्रिप्ट को नियंत्रित भी कर सकता हूं।

इस स्क्रिप्ट में Build Number केवल वर्तमान दिनांक के साथ सेट है। अद्वितीय निर्माण संख्या उत्पन्न करने के अन्य तरीके हैं। एक दृष्टिकोण जेरेड सिंक्लेयर के ब्लॉग पर शामिल है जो नवीनतम प्रतिबद्धता के लिए गित हैश का उपयोग करता है। जिस स्क्रिप्ट का मैं उपयोग कर रहा हूं वह एक टाइमस्टैम्प का उपयोग करता है जो एक मिनट तक चला जाता है। मुझे यह जानना उपयोगी लगता है कि निर्माण कब बनाया गया था और बिल्डस्टैम के रूप में बिल्ड नंबर को डबल करने के बाद मैं तुरंत तारीख देख सकता हूं। और मेरे उद्देश्यों के लिए यह काफी अद्वितीय है।

http://blog.jaredsinclair.com/post/97193356620/the-best-of-all-possible-xcode-automated-build

#!/bin/sh 
set -e 

# Purpose: Updates Info.plist for app and dSYM to a unique value for each build. 

# Usage: 
# Add as a Run Script in Xcode Build Phases 

# UPDATE_SCRIPT=${PROJECT_DIR}/update_build_number.sh 
# if [ -f ${UPDATE_SCRIPT} ]; then 
#  sh ${UPDATE_SCRIPT} 
# fi 

BUILD_NUMBER=`date "+%Y.%m.%d.%H%M"` 
APP_INFO_PLIST=${TARGET_BUILD_DIR}/${INFOPLIST_PATH} 
DSYM_INFO_PLIST=${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist 

if [ -f ${APP_INFO_PLIST} ]; then 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${APP_INFO_PLIST}" 
    echo "Updated ${APP_INFO_PLIST}" 
else 
    echo "Could not find ${APP_INFO_PLIST}" 
fi 

# Only the Release Configuration creates the dSYM 
if [ "${CONFIGURATION}" = 'Release' ]; then 
    if [ -f ${DSYM_INFO_PLIST} ]; then 
     /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${DSYM_INFO_PLIST}" 
     echo "Updated ${DSYM_INFO_PLIST}" 
    else 
     echo "Could not find ${DSYM_INFO_PLIST}" 
    fi 
fi 
संबंधित मुद्दे