2011-03-14 6 views
9

एक निरंतर एकीकरण प्रणाली स्थापित करने के लिए, हडसन, मैंने स्वचालित रूप से एक्सकोड प्रोजेक्ट बनाने के लिए एक बैश स्क्रिप्ट लिखी। इसके अलावा, डीबग कॉन्फ़िगरेशन में, यह मुझसे पूछा गया था कि PROJECT-Info.plist फ़ाइल के CFBundleRevision फ़ील्ड में $ {BUNDLE_VERSION} .r $ {SVN_REVISION} के रूप में प्रोजेक्ट की svn संशोधन संख्या डालने के लिए।PROJECT-Info.plist फ़ाइल के CFBundleVersion फ़ील्ड को संपादित करने के लिए बैश स्क्रिप्ट

sed 'N;s_^.*<key>CFBundleVersion</key>.*<string>[0-9][0-9]*\.[0-9][0-9]*</string>$_<key>CFBundleVersion</key>\ 
<string>'"$BUNDLE_VERSION"'\.r'"$SVN_REVISION"'</string>_' $PROJECT-Info.plist 

यह स्क्रिप्ट "1.0" स्ट्रिंग बदल दिया जाना चाहिए:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
[...] 
    <key>CFBundleVersion</key> 
    <string>1.0</string> 
[...] 
</dict> 
</plist> 

मैं नीचे इस bash स्क्रिप्ट की कोशिश की:

आप नीचे दिए गए परियोजना-Info.plist फ़ाइल के स्रोत कोड मिल जाएगा $ {BUNDLE_VERSION} .r $ {SVN_REVISION} के साथ (केवल वर्तमान में मानक आउटपुट में)। हालांकि, प्रतिस्थापन 'एन' विकल्प के बिना काम करता है जिसमें एक बार में एक पंक्ति के लिए और एक पंक्ति के लिए शामिल है। लेकिन PROJECT-Info.plist फ़ाइल में "<string>[...]</string>" स्ट्रिंग के साथ कई पंक्तियां हैं ...

मुझे लगता है कि यह दो पंक्तियों ('एन' विकल्प और "। *" के बीच अज्ञात वर्णों को संसाधित करने का मेरा तरीका है कोई पात्र) गलत है।

कोई विचार?

अग्रिम धन्यवाद और अंग्रेजी में मेरे खराब स्तर के लिए खेद है।

+0

आप इस तरह के एक अजगर या पर्ल मॉड्यूल जो एक XML फ़ाइल में कुंजी और मूल्यों से छेड़छाड़ के उद्देश्य के लिए बनाया गया है के रूप में एक उचित एक्सएमएल उपकरण का उपयोग करने की जरूरत है। एक्सएमएलस्टारलेट जैसे शैल यूटिलिटीज भी उपलब्ध हैं। [Regexes चुनौती तक नहीं हैं] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)। वैसे, आपकी अंग्रेजी बहुत करीब है। –

+0

[xmlstarlet] (http://xmlstar.sourceforge.net/) खोल उपयोगिता समाधान के लिए धन्यवाद। मैंने इसे डाउनलोड और इंस्टॉल किया। मैं कल इसका परीक्षण करूंगा और मैं आपको अपना फीडबैक दूंगा। –

उत्तर

0
$ myversion=1.0.3 
$ perl -O777 -i.bak -pe 's|<key>CFBundleVersion</key>\\s*<string>[\d.]*</string>|<key>CFBundleVersion</key></key>'"$myversion"'<string>|' bundle 

bundle.bak करने के लिए फ़ाइल bundle ले जाता है, और नए bundle फ़ाइल में 1.0.3 साथ 1.0.6.9 बदल देता है।

+0

मैं इस समाधान को पहले कोशिश करूंगा जब मैं कल काम पर वापस जाऊंगा। धन्यवाद :) –

+0

मैं बहुत उत्सुक हूं कि मैंने तुरंत कोशिश की और यह अच्छी तरह से काम करता है! मैं बस इस कमांड लाइन को नीचे के रूप में संशोधित करता हूं क्योंकि मैं अपनी स्क्रिप्ट में पहले .plist फ़ाइल का बैकअप बना देता हूं और मैं इसे अंत में पुनर्स्थापित करता हूं। 'पर्ल -0777 पीई" एस | CFBundleVersion \ s * [\ डी।] * | CFBundleVersion $ BUNDLE_VERSION.r $ संशोधन | " प्रोजेक्ट- Info.plist.bak> परियोजना-Info.plist' आप दोनों का धन्यवाद। –

+0

इस कोड को – Warewolf

24

उपयोग PlistBuddy:

# cf. http://davedelong.com/blog/2009/04/15/incrementing-build-numbers-xcode 
/usr/libexec/PlistBuddy -h 
/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" test.plist 
myversion=1.0.5 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion '${myversion}'" test.plist 
+0

+1 चलाने के लिए कहां है। जाहिर है जाने का रास्ता। – bobbogo

+0

धन्यवाद। ऐसा करने का यह सही तरीका है।दूसरा जवाब एक बहुत अनावश्यक हैक है। – chown

6

इस विशेष मामले के आप भी Xcode के agvtool का उपयोग कर सकते हैं। आपको PROJECT-Info.plist फ़ाइल का मार्ग प्रदान करने की भी आवश्यकता नहीं है। अपनी परियोजना dir रन के अंदर:

agvtool new-version -all "$BUILD_NUMBER" # sets CFBundleVersion 
agvtool new-marketing-version "$BUNDLE_VERSION" # sets CFBundleShortVersionString 
+0

विकी लिंक मर चुका है। –

+0

मेरे लिए काम करता है! धन्यवाद! Agvtool परियोजना फ़ोल्डर में इस्तेमाल किया जाना चाहिए। – Marslo

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