CFBundleVersion और CFBundleShortVersionString को $ (CURRENT_PROJECT_VERSION) और $ (MARKETING_VERSION) में बदलने से Xcode 11 को कैसे रोकें?


14

संस्करण 11 के बाद से, Xcode मेरी सेट CFBundleVersionकरने के लिए मूल्य $(CURRENT_PROJECT_VERSION)और मेरे CFBundleShortVersionStringमूल्य के लिए $(MARKETING_VERSION)जब भी मैं लक्ष्य सेटिंग्स (टैब "सामान्य") में संस्करण या मूल्यों बिल्ड दर्ज करें।

वास्तविक संस्करण और मेरे द्वारा दर्ज मानों का निर्माण अब प्रोजेक्ट.पीबीएक्सप्रोज फाइल में संग्रहीत है। मुझे यह व्यवहार पसंद नहीं है या पसंद नहीं है, क्योंकि मैं बिल्ड समय पर मूल्यों को संशोधित करने के लिए शेल स्क्रिप्ट का उपयोग करता हूं।

मैं Info.plist फ़ाइल में मैन्युअल रूप से सही मान सेट कर सकता हूं, लेकिन जैसे ही मैं लक्ष्य सेटिंग में संस्करण या बिल्ड नंबर बदलता हूं, Info.plist फ़ाइल फिर से Xcode द्वारा बदल जाती है।

मैं Xcode 11 को ऐसा करने से कैसे रोकूं?

जब मैं प्रोजेक्ट फ़ाइल को बदलने के लिए अपनी बिल्ड स्क्रिप्ट को संशोधित करता हूं, तो प्रोजेक्ट फाइल बदलते ही Xcode बिल्ड को तुरंत रद्द कर देगा।


आप मान प्राप्त करने के लिए अपनी शेल स्क्रिप्ट को संशोधित करने के बजाय Xcode 11 को ऐसा करने से क्यों रोकना चाहेंगे?
मैनुअल

1
@ मैनुअल मुझे लगता है कि एक प्लिस्ट का उपयोग plistbuddyकरना अच्छा और साफ है, जबकि प्रोजेक्ट फ़ाइल को संशोधित करना अधिक गड़बड़ है, अविश्वसनीय है और फाइल फॉर्मेट में अनएक्सपेक्टेड बदलाव के लिए प्रवण है।
श्री ज़ीस्टम

1
जब आप फ़ाइल स्वरूप को समझते हैं, तो प्रोजेक्ट.pbxproj फ़ाइल को मैनिप्युलेट करना गड़बड़ नहीं है। यह सिर्फ एक नेक्स्ट स्टाइल प्लिस्ट है जिसे अच्छी तरह से प्रलेखित किया गया है। तुम भी plistbuddy के साथ फ़ाइल को संशोधित कर सकते हैं, यह इस प्रारूप के साथ संगत है।
मैनुअल

मैंने आपके उपयोग के मामले में एक सुझाव के साथ अपना उत्तर अपडेट किया।
मैनुअल

जवाबों:


1

सड़क अब तक

मेरा उपयोग मामला यह था कि:

  1. मैं संस्करण को सिंक्रनाइज़ कर रहा हूं और कई लक्ष्यों के बीच संख्याओं का निर्माण कर रहा हूं।
  2. मैं संस्करण को सिंक्रनाइज़ कर रहा हूं और लक्ष्य के साथ संख्याओं का निर्माण कर रहा हूं Settigns.bundle
  3. मैं एक CI सर्वर से बिल्ड नंबर को पढ़ रहा हूं और संशोधित कर रहा हूं।

मैं सीआई पर ही कस्टम स्क्रिप्ट के रूप में बिंदु 1 और 2 को लक्ष्य निर्माण स्क्रिप्ट और बिंदु 3 के रूप में निष्पादित करता था।

संस्करण को स्टोर करने और Xcode बिल्ड सेटिंग्स के भीतर निर्माण का नया तरीका स्क्रिप्ट के साथ समस्या पैदा कर रहा था, क्योंकि वे अब मूल्यों को प्रभावी ढंग से संशोधित करने में सक्षम नहीं थे। कम से कम पढ़ना संभव था।

दुर्भाग्य से मैं संस्करण को स्टोर करने और प्रोजेक्ट बिल्ड सेटिंग्स में संख्याओं को बनाने से Xcode को रोकने का एक वैध तरीका खोजने में सक्षम नहीं था, हालांकि मैं एक वर्कअराउंड बनाने में कामयाब रहा।

यह पता चलता है कि जब कोई बिल्ड या आर्काइव बनाया जाता है, तो उसमें लिखे मूल्य Info.plistका उपयोग किया जाता है। इसका मतलब है कि मूल्य का निर्माण समय के दौरान किया जाता है, जो हमें उसी निर्माण समय के दौरान इसे संशोधित करने की अनुमति नहीं देता है।

मैंने xcodeprojक्ली का उपयोग करके परियोजना को संशोधित करने का भी प्रयास किया है , हालांकि परियोजना में कोई भी परिवर्तन किसी भी निर्माण को रोकने का कारण बन रहा था, इसलिए यह समाधान काम नहीं कर रहा था।

आखिरकार, बहुत सारे अलग-अलग तरीकों के बाद जो मैंने कोशिश की, मैंने आखिरकार एक समझौता किया है जो एक्सकोड के नए व्यवहार का उल्लंघन नहीं कर रहा था।

संक्षिप्त जवाब:

लक्ष्य पूर्व कार्रवाई के रूप में, एक स्क्रिप्ट निष्पादित की जाती है जो संबंधित मूल्यों को CFBundleShortVersionStringऔर CFBundleVersionलक्ष्य को लिखती हैInfo.plist

सच्चाई का एक स्रोत के रूप में, मैं Xcode निर्माण सेटिंग्स का उपयोग के मूल्यों को पढ़ने के लिए MARKETING_VERSIONऔर CURRENT_PROJECT_VERSIONवांछित लक्ष्य की।

इस तरह, जब आप प्रोजेक्ट सेटिंग्स से मानों को संशोधित करते हैं - अगले बिल्ड / संग्रह पर - उन्हें लिखा जाएगा Info.plist, जिससे कोई भी अगर आपके मौजूदा स्क्रिप्टिंग तर्क को काम करना जारी रख सके।

विस्तृत जवाब

बिल्ड एक्शन पर संसाधन को संशोधित करने का एकमात्र तरीका pre-actionस्क्रिप्ट का उपयोग करना है । यदि आप इसे बिल्ड स्क्रिप्ट से करने का प्रयास करते हैं - परिवर्तन तुरंत प्रभाव नहीं लेंगे और बिल्ड / संग्रह के अंत में मौजूद नहीं होंगे।

प्री-बिल्ड एक्शन जोड़ने के लिए - एडिट स्कीम पर जाएं।

यहां छवि विवरण दर्ज करें

फिर बिल्ड और आर्काइव वर्गों का विस्तार करें। के तहत Pre-action, Provide build and settings fromड्रॉपडाउन पर क्लिक करें और सत्य लक्ष्य का स्रोत चुनें जिसमें से आप मूल्यों को पढ़ना चाहते हैं।

यहां छवि विवरण दर्ज करें

निम्नलिखित स्क्रिप्ट जोड़ें:

# 1) 
cd ${PROJECT_DIR}

# 2) 
exec > Pruvit-Int.prebuild.sync_project_version_and_build_with_info_plists.log 2>&1

# 3) 
./sync_project_version_and_build_with_info_plists.sh $MARKETING_VERSION $CURRENT_PROJECT_VERSION

विभाजन रेखाएँ निम्नलिखित कार्य करती हैं:

  1. उस निर्देशिका पर जाएं जहां इसे निष्पादित करने के लिए सिंक स्क्रिप्ट स्थित है
  2. पूर्व-क्रिया के दौरान लॉग को लिखने की अनुमति देता है, अन्यथा कोई भी आउटपुट डिफ़ॉल्ट रूप से खामोश हो जाता है
  3. MARKETING_VERSIONऔर प्रदान करके सिंक स्क्रिप्ट निष्पादित करेंCURRENT_PROJECT_VERSION

अंतिम चरण अपनी खुद की सिंक स्क्रिप्ट लिखना है जो प्रदान किए गए मूल्यों MARKETING_VERSIONऔर CURRENT_PROJECT_VERSIONसंबंधित लक्ष्य / एस और जब भी आप चाहते हैं के मूल्यों को पढ़ता है ।

मेरे मामले में स्क्रिप्ट निम्नलिखित है:

#!/bin/bash

#IMPORTANT - this script must run as pre-action of each target's Build and Archive actions

version_number=$1
build_number=$2

echo "version_number is $version_number"
echo "build_number is $build_number"

#update Pruvit/Info.plist
pruvitInfoPlist="Pruvit/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $pruvitInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $pruvitInfoPlist

#update Pruvit/Settings.bundle
settingsPlist="Pruvit/Settings.bundle/Root.plist"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version_number" $settingsPlist
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $build_number" $settingsPlist

#update BadgeCounter/Info.plist
badgeCounterInfoPlist="BadgeCounter/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $badgeCounterInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $badgeCounterInfoPlist

मैं अपने ऐप लक्ष्य के बीच साझा Info.plistऔर Settings.bundleदोनों का उपयोग करता हूं, इसलिए मुझे इसे एक बार अपडेट करना होगा।

इसके अलावा, मैं एक अधिसूचना सेवा विस्तार का उपयोग करता हूं BadgeCounter, जिसमें सटीक एक ही संस्करण होना चाहिए और लक्ष्य के रूप में निर्माण करना चाहिए जिसमें यह एम्बेडेड है। इसलिए मैं इसे भी अपडेट करता हूं।


1

मत करो।

संभवत: एक कारण है कि यह व्यवहार क्यों बदल गया। यदि बाद में Xcode फीचर्स इस व्यवहार पर निर्मित होते हैं, तो चीजें लाइन के नीचे अधिक से अधिक "निर्मित" हो जाती हैं।

Xcode को मोड़ने की कोशिश करने के बजाय, निर्माण स्क्रिप्ट इन मूल्यों को कैसे पुनः प्राप्त करती है:

स्क्रिप्ट के साथ Xcode 11 में वर्तमान ऐप संस्करण कैसे पढ़ें

यदि आपको project.pbxprojफ़ाइल में हेरफेर करने की आवश्यकता है , तो यह एक नेक्स्ट स्टाइल प्लिस्ट है जिसे अच्छी तरह से प्रलेखित किया गया है। आप उपयोग कर सकते हैं plistbuddyजो इस पुराने प्रारूप के साथ संगत है। awkयदि आप अधिक जटिल जोड़तोड़ करते हैं तो आप अधिक स्क्रिप्टिंग के साथ भी उपयोग कर सकते हैं ।

अगर मैं आपके उपयोग के मामले को समझता हूं, तो आप एक ऐसी स्क्रिप्ट लिख सकते हैं जो उच्चतम संस्करण संख्याओं के साथ मिलती है awkऔर फिर सभी निचले संस्करण संख्याओं को अपडेट करती है जो फ़ाइल में मिल सकती है sed


मुद्रण मान के साथ PlistBuddy काम करना ठीक लगता है, लेकिन जब मैं setपूरे प्रोजेक्ट का उपयोग करता हूं। pbxproj एक XML .plist फ़ाइल में परिवर्तित हो जाता है और अब Xcode द्वारा पढ़ा नहीं जा सकता है। उदाहरण:PlistBuddy -c "Set :objects:$configurationId:buildSettings:CURRENT_PROJECT_VERSION $newProjectVersion" "$projectFile"
मिस्टर ज़ीस्टम

वास्तव में आप क्या हासिल करना चाहते हैं, इसके आधार पर, आपको टूल्स का एक संयोजन उपयोग करना पड़ सकता है
मैनुअल

Xcode को पुनरारंभ करने से XML समस्या ठीक हो गई। Als ने पाया कि pbxprojफ़ाइल स्क्रिप्ट को बदलने वाली बिल्ड स्क्रिप्ट को चलाने पर बिल्ड रद्द हो जाता है। तो यह वास्तव में काम करने वाला नहीं है मुझे डर है।
मिस्टर ज़ीस्टम

मैंने उपरोक्त जानकारी के साथ अपना मूल प्रश्न अपडेट किया।
मि। ज़ीस्टम

1
उदाहरण के लिए - मेरा उपयोग मामला संस्करण को सिंक करने और कई लक्ष्यों के निर्माण के लिए है - मैं संस्करण को सेट करना और पहले लक्ष्य को बनाना चाहूंगा और यह सभी अन्य के लिए स्वचालित रूप से अपडेट हो जाता है। यह पहले अच्छी तरह से काम कर रहा था, क्योंकि आप सिर्फ एक संसाधन को संशोधित करते हैं। अब मैं किसी भी लक्ष्य के निर्माण चरण के दौरान परियोजना को संशोधित नहीं कर सकता, क्योंकि निर्माण रद्द हो जाता है।
कोकमोहटा में
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.