วิธีการหยุด Xcode 11 จากการเปลี่ยน CFBundleVersion และ CFBundleShortVersionString เป็น $ (CURRENT_PROJECT_VERSION) และ $ (MARKETING_VERSION)


14

ตั้งแต่รุ่นที่ 11, Xcode ตั้งCFBundleVersionค่าของฉันเป็น$(CURRENT_PROJECT_VERSION)และของฉันCFBundleShortVersionStringค่า$(MARKETING_VERSION)เมื่อใดก็ตามที่ฉันป้อนค่ารุ่นหรือสร้างในการตั้งค่าเป้าหมาย (แท็บ "ทั่วไป")

เวอร์ชันจริงและค่าบิลด์ที่ฉันป้อนจะถูกเก็บไว้ในไฟล์ project.pbxproj ฉันไม่ต้องการหรือชอบพฤติกรรมนี้เนื่องจากฉันใช้เชลล์สคริปต์เพื่อแก้ไขค่าใน buildtime

ฉันสามารถตั้งค่าที่ถูกต้องในไฟล์ Info.plist ด้วยตนเอง แต่ทันทีที่ฉันเปลี่ยนหมายเลข Version หรือ Build ในการตั้งค่าเป้าหมายไฟล์ Info.plist จะเปลี่ยนอีกครั้งโดย Xcode

ฉันจะหยุด Xcode 11 จากการทำเช่นนี้ได้อย่างไร

เมื่อฉันแก้ไขสคริปต์การสร้างของฉันเพื่อเปลี่ยนไฟล์โครงการเอง Xcode จะยกเลิกการสร้างทันทีที่มีการเปลี่ยนแปลงไฟล์โครงการ


ทำไมคุณต้องการให้ Xcode 11 หยุดทำเช่นนี้แทนที่จะแก้ไขเชลล์สคริปต์ของคุณเพื่อรับค่า
มานูเอล

1
@ มานูเอลฉันคิดว่าการดัดแปลงโปรแกรมที่ใช้plistbuddyนั้นดีและสะอาดในขณะที่การแก้ไขไฟล์โครงการนั้นยุ่งกว่ามากไม่น่าเชื่อถือและมีแนวโน้มที่จะเกิดการเปลี่ยนแปลงที่ไม่คาดคิดในรูปแบบไฟล์
Mr. Zystem

1
การจัดการไฟล์ project.pbxproj ไม่ยุ่งเมื่อคุณเข้าใจรูปแบบไฟล์ มันเป็นแค่การเขียนแบบต่อไปที่มีการบันทึกไว้อย่างดี คุณสามารถแก้ไขไฟล์ด้วย plistbuddy มันเข้ากันได้กับรูปแบบนี้
มานูเอล

ฉันอัพเดตคำตอบของฉันพร้อมคำแนะนำสำหรับกรณีการใช้งานของคุณ
มานูเอล

คำตอบ:


1

ถนนไกล

กรณีใช้ของฉันคือ:

  1. ฉันกำลังซิงโครไนซ์เวอร์ชันและสร้างหมายเลขในหลาย ๆ เป้าหมาย
  2. ฉันกำลังซิงโครไนซ์เวอร์ชันและสร้างหมายเลขกับเป้าหมาย Settigns.bundle
  3. ฉันกำลังอ่านและแก้ไขหมายเลขบิลด์จากเซิร์ฟเวอร์ CI

ฉันเคยรันจุด 1 และ 2 เป็นสคริปต์สร้างเป้าหมายและจุด 3 เป็นสคริปต์ที่กำหนดเองใน CI เอง

วิธีใหม่ในการจัดเก็บเวอร์ชันและบิลด์ภายในการตั้งค่าการสร้าง Xcode ทำให้เกิดปัญหากับสคริปต์เนื่องจากไม่สามารถแก้ไขค่าได้อย่างมีประสิทธิภาพอีกต่อไป อย่างน้อยก็อ่านได้

น่าเสียดายที่ฉันไม่สามารถค้นพบวิธีที่ถูกต้องในการป้องกัน Xcode ไม่ให้จัดเก็บเวอร์ชันและหมายเลขบิลด์ลงในการตั้งค่าการสร้างโปรเจ็กต์อย่างไรก็ตามฉันได้จัดการเพื่อสร้างวิธีแก้ปัญหา

ปรากฎว่าเมื่อมีการสร้างหรือเก็บทำค่าเขียนในInfo.plistถูกนำมาใช้ ซึ่งหมายความว่าค่าจะถูกแทนที่ระหว่างเวลาบิลด์ซึ่งไม่อนุญาตให้เราแก้ไขในระหว่างเวลาบิลด์เดียวกัน

ฉันยังพยายามแก้ไขโครงการโดยใช้xcodeprojCLI อย่างไรก็ตามการเปลี่ยนแปลงใด ๆ ในโครงการทำให้งานสร้างใด ๆ หยุดลงดังนั้นโซลูชันนี้ไม่ทำงาน

ในที่สุดหลังจากหลายวิธีที่ฉันลองใช้ในที่สุดฉันก็จัดการพบการประนีประนอมที่ไม่ได้ละเมิดพฤติกรรมใหม่ของ Xcode

คำตอบสั้น ๆ :

ในฐานะที่เป็นเป้าหมายของการดำเนินการล่วงหน้าสคริปต์จะถูกดำเนินการซึ่งจะเขียนค่าที่เกี่ยวข้องไปยัง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

บรรทัด scrip ทำสิ่งต่อไปนี้:

  1. ไปที่ไดเรกทอรีที่มีสคริปต์การซิงค์อยู่เพื่อเรียกใช้งาน
  2. อนุญาตให้เขียนบันทึกในระหว่างการดำเนินการล่วงหน้าไม่เช่นนั้นเอาต์พุตใด ๆ จะถูกปิดเสียงโดยค่าเริ่มต้น
  3. ดำเนินการสคริปต์การซิงค์โดยระบุMARKETING_VERSIONและCURRENT_PROJECT_VERSION

ขั้นตอนสุดท้ายคือการเขียนสคริปต์ซิงค์ของคุณเองที่อ่านค่าของที่ให้ไว้MARKETING_VERSIONและCURRENT_PROJECT_VERSIONไปยังเป้าหมาย / s ที่เกี่ยวข้องและเมื่อใดก็ตามที่คุณต้องการ

ในกรณีของฉันสคริปต์มีดังต่อไปนี้:

#!/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กับการเขียนสคริปต์เพิ่มเติมได้ถ้าคุณมีกิจวัตรที่ซับซ้อนมากขึ้น

ถ้าผมเข้าใจกรณีการใช้งานของคุณคุณสามารถเขียนสคริปต์ที่ได้รับสูงสุดหมายเลขรุ่นด้วยแล้วอัพเดททั้งหมดหมายเลขรุ่นที่ต่ำกว่าก็จะพบในไฟล์ที่มีawksed


ค่าการพิมพ์ด้วยPlistBuddy ดูเหมือนว่าจะทำงานได้ดี แต่เมื่อฉันใช้setคำสั่ง project ทั้งหมด pbxproj จะถูกแปลงเป็นไฟล์ XML .plist และไม่สามารถอ่านได้อีกต่อไปโดย Xcode ตัวอย่าง:PlistBuddy -c "Set :objects:$configurationId:buildSettings:CURRENT_PROJECT_VERSION $newProjectVersion" "$projectFile"
Mr. Zystem

คุณอาจต้องใช้เครื่องมือหลายอย่างรวมกัน
Manuel

การรีสตาร์ท Xcode แก้ไขปัญหา XML พบว่าเมื่อเรียกใช้งานบิลด์สคริปต์ที่เปลี่ยนแปลงpbxprojไฟล์จะยกเลิกการบิลด์ ดังนั้นฉันจึงไม่กลัวที่จะไปทำงาน
Mr. Zystem

ฉันอัปเดตคำถามเดิมด้วยข้อมูลข้างต้น
Mr. Zystem

1
ตัวอย่างเช่น - กรณีการใช้งานของฉันคือการซิงค์เวอร์ชันและสร้างข้ามเป้าหมายหลายรายการ - ฉันต้องการตั้งค่าเวอร์ชันและสร้างเป็นเป้าหมายแรก มันทำงานได้ดีมาก่อนเพราะคุณเพิ่งแก้ไขทรัพยากร ตอนนี้ฉันไม่สามารถแก้ไขโครงการได้ในระหว่างขั้นตอนการสร้างของเป้าหมายใด ๆ เนื่องจากงานสร้างถูกยกเลิก
KoCMoHaBTa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.