কীভাবে এক্সকোড 11 কে সিএফবান্ডেল ভার্সন এবং সিএফবান্ডেলশার্ট ভার্সন স্ট্রিং থেকে $ (CURRENT_PROJECT_VERSION) এবং $ (MARKETING_VERSION) এ পরিবর্তন করবেন?


14

সংস্করণ 11 সাল থেকে, Xcode আমার সেট করে CFBundleVersionমান $(CURRENT_PROJECT_VERSION)এবং আমার CFBundleShortVersionStringমান $(MARKETING_VERSION)যখনই আমি লক্ষ্য সেটিংস (ট্যাব "সাধারণ") এ সংস্করণ বা মান বিল্ড লিখুন।

আমি যে প্রকৃত সংস্করণ এবং বিল্ড মানগুলি প্রবেশ করি তা এখন প্রকল্প.pbxproj ফাইলে সংরক্ষণ করা হয়। আমি এই আচরণটি চাই না বা পছন্দ করি না, কারণ আমি বিল্ডটাইমের সময় মানগুলি সংশোধন করতে শেল স্ক্রিপ্ট ব্যবহার করি।

আমি ম্যানুয়ালি তথ্য.পলিট ফাইলে সঠিক মানগুলি সেট করতে পারি, তবে টার্গেট সেটিংসে সংস্করণ বা সংখ্যা তৈরি করার সাথে সাথে ইনফো.প্লিস্ট ফাইলটি আবার এক্সকোড দ্বারা পরিবর্তিত হবে।

আমি Xcode 11 কে এটি করা থেকে কীভাবে থামাব?

আমি যখন আমার বিল্ড স্ক্রিপ্টটি প্রজেক্টের ফাইলটি নিজেই পরিবর্তন করতে পরিবর্তন করি তখন এক্সকোড প্রকল্প ফাইল পরিবর্তন হওয়ার সাথে সাথেই বিল্ডটি বাতিল করে দেয়।


মানটি পুনরুদ্ধার করতে আপনার শেল স্ক্রিপ্টটি পরিবর্তনের পরিবর্তে আপনি কেন Xcode 11 এটি করা বন্ধ করতে চান?
ম্যানুয়েল

1
@ ম্যানুয়েল আমার মনে হয় প্লাস্টি ব্যবহার করে সংশোধন plistbuddyকরা ভাল এবং পরিষ্কার, যদিও প্রকল্পের ফাইলটি পরিবর্তন করা অনেক বেশি অগোছালো, অবিশ্বাস্য এবং ফাইল ফর্ম্যাটে পরিবর্তিত পরিবর্তনগুলির প্রবণ।
মিস্টার জিস্টেম

1
আপনি যখন ফাইল ফর্ম্যাটটি বুঝতে পারবেন তখন প্রকল্প.pbxproj ফাইলটি ম্যানিপুলেট করা অসুবিধা নয়। এটি ঠিক একটি নেক্সট স্টাইলের প্লিস্ট যা ভালভাবে নথিভুক্ত। আপনি প্লাস্টবদ্দি দিয়ে ফাইলটিও সংশোধন করতে পারেন, এটি এই ফর্ম্যাটটির সাথে সামঞ্জস্যপূর্ণ।
ম্যানুয়েল

আমি আপনার ব্যবহারের ক্ষেত্রে পরামর্শের সাথে আমার উত্তর আপডেট করেছি।
ম্যানুয়েল

উত্তর:


1

এখনও পর্যন্ত রাস্তা

আমার ব্যবহারের ক্ষেত্রে এটি ছিল:

  1. আমি সংস্করণটি সিঙ্ক্রোনাইজ করছি এবং বেশ কয়েকটি লক্ষ্যবস্তুতে সংখ্যা তৈরি করছি।
  2. আমি সংস্করণটি সিঙ্ক্রোনাইজ করছি এবং লক্ষ্যগুলির সাথে সংখ্যা তৈরি করছি Settigns.bundle
  3. আমি সিআই সার্ভার থেকে বিল্ড নম্বরটি পড়ছি এবং সংশোধন করছি।

আমি টার্গেট বিল্ড স্ক্রিপ্ট হিসাবে পয়েন্ট 1 এবং 2 এবং সিআইতে নিজেই কাস্টম স্ক্রিপ্ট হিসাবে পয়েন্ট 3 চালিত করতাম।

এক্সকোড বিল্ড সেটিংসের মধ্যে সংস্করণ সংরক্ষণ এবং বিল্ড করার নতুন উপায়টি স্ক্রিপ্টগুলির সাথে সমস্যা সৃষ্টি করেছিল, কারণ তারা কার্যকরভাবে মানগুলি সংশোধন করতে সক্ষম হয় নি। কমপক্ষে পড়া সম্ভব ছিল।

দুর্ভাগ্যক্রমে আমি এক্সকোডটিকে সংস্করণ সংরক্ষণ করতে এবং প্রজেক্ট বিল্ড সেটিংসে সংখ্যা তৈরি করতে বাধা দেওয়ার একটি বৈধ উপায় আবিষ্কার করতে সক্ষম হইনি, তবে আমি একটি কার্যনির্বাহ তৈরি করতে সক্ষম হয়েছি।

দেখা যাচ্ছে যে যখন কোনও বিল্ড বা সংরক্ষণাগার তৈরি করা হয় তখন এতে লেখা মানটি Info.plistব্যবহার করা হয়। এর অর্থ হ'ল বিল্ড সময় চলাকালীন মানটি প্রতিস্থাপিত হয় যা আমাদের একই বিল্ড সময়কালে এটি পরিবর্তন করতে দেয় না।

আমি xcodeprojক্লাইটি ব্যবহার করে প্রকল্পটি সংশোধন করার চেষ্টাও করেছি , তবে প্রকল্পে যে কোনও পরিবর্তন ঘটে যাওয়ায় কোনও বিল্ড বন্ধ হয়ে গেছে, সুতরাং এই সমাধানটি কাজ করছে না।

অবশেষে, আমি চেষ্টা করেছি এমন অনেকগুলি ভিন্ন পদ্ধতির পরে, আমি শেষ পর্যন্ত এমন একটি আপস খুঁজে পেয়েছি যা এক্সকোডের নতুন আচরণ লঙ্ঘন করছে না।

সংক্ষিপ্ত উত্তর:

লক্ষ্য প্রাক-ক্রিয়া হিসাবে, একটি স্ক্রিপ্ট কার্যকর করা হয় যা লক্ষ্যটির CFBundleShortVersionStringএবং তার সাথে সম্পর্কিত মানগুলি লিখে দেয়CFBundleVersionInfo.plist

সত্যের উত্স হিসাবে, আমি পছন্দসই লক্ষ্যটির মান MARKETING_VERSIONএবং পড়ার জন্য এক্সকোড বিল্ড সেটিংস ব্যবহার করি CURRENT_PROJECT_VERSION

এইভাবে, আপনি যখন প্রজেক্ট সেটিংস থেকে মানগুলি সংশোধন করেন - পরবর্তী বিল্ড / সংরক্ষণাগার উপর - সেগুলিতে লিখিত হবে Info.plist, আপনার বিদ্যমান স্ক্রিপ্টিং যুক্তিটি যদি কাজ চালিয়ে যাওয়ার অনুমতি দেয় তবে তা কোনওটিকেই অনুমতি দেয়।

বিস্তারিত উত্তর

কোনও বিল্ড অ্যাকশনের মাধ্যমে কোনও সংস্থান পরিবর্তন করার একমাত্র উপায় হ'ল pre-actionস্ক্রিপ্ট ব্যবহার using যদি আপনি এটি কোনও বিল্ড স্ক্রিপ্ট থেকে করার চেষ্টা করেন - পরিবর্তনগুলি তাত্ক্ষণিকভাবে কার্যকর হবে না এবং বিল্ড / সংরক্ষণাগারটির শেষে উপস্থিত হবে না।

প্রাক-বিল্ড অ্যাকশন যুক্ত করতে - স্কিম সম্পাদনা করতে যান।

এখানে চিত্র বর্ণনা লিখুন

তারপরে বিল্ড এবং আর্কাইভ বিভাগগুলি প্রসারিত করুন। এর অধীনে 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

না।

সম্ভবতঃ আচরণের পরিবর্তনের কারণ রয়েছে। যদি পরবর্তী সময়ে এক্সকোড বৈশিষ্ট্যগুলি এই আচরণের উপর ভিত্তি করে তৈরি করে, জিনিসগুলি আরও বেশি করে "নির্মিত" হয়ে যায় "

এক্সকোড বাঁকানোর চেষ্টা করার পরিবর্তে, বিল্ড স্ক্রিপ্ট কীভাবে এই মানগুলি পুনরুদ্ধার করে তা পরিবর্তন করুন:

স্ক্রিপ্ট সহ কীভাবে এক্সকোড 11 এ বর্তমান অ্যাপ্লিকেশন সংস্করণটি পড়বেন

আপনার যদি project.pbxprojফাইলটি পরিচালনা করতে হয় তবে এটি একটি নেক্সট স্টাইলের প্লিস্ট যা ভালভাবে নথিভুক্ত। আপনি এটি ব্যবহার করতে পারেন plistbuddyযা এই পুরানো ফর্ম্যাটটির সাথে সামঞ্জস্যপূর্ণ। awkআপনার আরও জটিল হেরফের থাকলে আপনি আরও স্ক্রিপ্টিং দিয়েও ব্যবহার করতে পারেন।

যদি আমি আপনার ব্যবহারের বিষয়টি বুঝতে পারি তবে আপনি এমন স্ক্রিপ্ট লিখতে পারেন যা সর্বাধিক সংস্করণ নম্বর পেয়েছে awkএবং তারপরে এটি ফাইলের মধ্যে থাকা সমস্ত নিম্ন সংস্করণ সংখ্যা আপডেট করবে sed


মুদ্রণের মানগুলি ঠিকঠাক হিসাবে PlistBuddy কাজ করে বলে মনে হয়, তবে আমি যখন setকমান্ডটি ব্যবহার করি তখন পুরো প্রজেক্ট.পিবিএক্সপোজ একটি এক্সএমএল .plist ফাইলে রূপান্তরিত হয় এবং এক্সকোড দ্বারা আর পড়া যায় না। উদাহরণ:PlistBuddy -c "Set :objects:$configurationId:buildSettings:CURRENT_PROJECT_VERSION $newProjectVersion" "$projectFile"
মিস্টার জিস্টেম

আপনি ঠিক কী অর্জন করতে চান তার উপর নির্ভর করে আপনাকে সরঞ্জামগুলির সংমিশ্রণটি ব্যবহার করতে হতে পারে
ম্যানুয়েল

এক্সকোড পুনরায় চালু করা XML সমস্যাটি স্থির করে। আলগুলি খুঁজে পেল যে কোনও বিল্ড স্ক্রিপ্ট চলার সময় pbxprojফাইলটি বদলে বিল্ডটি বাতিল করে দেয়। সুতরাং এটি সত্যিই কাজ করতে যাচ্ছে না আমি ভীত।
মিস্টার জিস্টেম

আমি উপরের তথ্য সহ আমার মূল প্রশ্নটি আপডেট করেছি।
মিস্টার জিসটেম

1
উদাহরণস্বরূপ - আমার ব্যবহারের ক্ষেত্রে সংস্করণটি সিঙ্ক করা এবং একাধিক লক্ষ্য নির্ধারণ করা - আমি সংস্করণটি সেট করতে এবং প্রথম লক্ষ্যটি তৈরি করতে চাই এবং এটি অন্য সমস্তটিতে স্বয়ংক্রিয়ভাবে আপডেট হয়ে যায়। এটি আগে ভাল কাজ করছিল, কারণ আপনি কেবল একটি সংস্থান পরিবর্তন করেছেন। এখন আমি কোনও লক্ষ্যের বিল্ড পর্বের সময় প্রকল্পটি পরিবর্তন করতে পারি না, কারণ বিল্ডটি বাতিল হয়ে যায়।
কোসিএমএইচবিটা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.