Sejak versi 11, Xcode menetapkan CFBundleVersion
nilai saya ke $(CURRENT_PROJECT_VERSION)
dan nilai saya CFBundleShortVersionString
ke $(MARKETING_VERSION)
setiap kali saya memasukkan Versi atau nilai Build di pengaturan target (tab "Umum").
Versi aktual dan nilai bangun yang saya masukkan sekarang disimpan dalam file project.pbxproj. Saya tidak ingin atau menyukai perilaku ini, karena saya menggunakan skrip shell untuk memodifikasi nilai saat buildtime.
Saya dapat secara manual mengatur nilai yang benar dalam file Info.plist, tetapi segera setelah saya mengubah Versi atau Build angka dalam pengaturan target, file Info.plist akan diubah lagi oleh Xcode.
Bagaimana cara menghentikan Xcode 11 dari melakukan ini?
Ketika saya memodifikasi skrip build saya untuk mengubah file proyek itu sendiri, Xcode akan segera membatalkan build segera setelah file proyek diubah.
sumber
plistbuddy
bagus dan bersih, sedangkan memodifikasi file proyek jauh lebih berantakan, tidak dapat diandalkan dan rentan terhadap perubahan tak terduga dalam format file.Jawaban:
Jalan sejauh ini
Kasus penggunaan saya adalah:
Settigns.bundle
Saya biasa mengeksekusi poin 1 dan 2 sebagai skrip build target dan point 3 sebagai skrip khusus pada CI itu sendiri.
Cara baru menyimpan versi dan membangun dalam pengaturan build Xcode menyebabkan masalah dengan skrip, karena mereka tidak lagi dapat secara efektif mengubah nilai-nilai. Setidaknya membaca adalah mungkin.
Sayangnya saya tidak dapat menemukan cara yang sah untuk mencegah Xcode dari menyimpan versi dan membangun nomor ke pengaturan membangun proyek, namun saya telah berhasil membuat solusi.
Ternyata ketika membangun atau arsip dibuat, nilai yang tertulis dalam
Info.plist
digunakan. Ini berarti bahwa nilai tersebut diganti selama waktu pembuatan, yang tidak memungkinkan kami untuk memodifikasinya selama waktu pembuatan yang sama.Saya juga mencoba memodifikasi proyek menggunakan
xcodeproj
cli, namun setiap perubahan pada proyek menyebabkan pembangunan berhenti, jadi solusi ini tidak berfungsi.Akhirnya, setelah banyak pendekatan berbeda yang saya coba, saya akhirnya berhasil menemukan kompromi yang tidak melanggar perilaku baru Xcode.
Jawaban singkat:
Sebagai tindakan awal sasaran, skrip dijalankan yang menulis nilai masing-masing ke
CFBundleShortVersionString
danCFBundleVersion
ke targetInfo.plist
Sebagai sumber kebenaran, saya menggunakan pengaturan build Xcode untuk membaca nilai
MARKETING_VERSION
danCURRENT_PROJECT_VERSION
target yang diinginkan.Dengan cara ini, ketika Anda memodifikasi nilai-nilai dari pengaturan proyek - setelah membangun / arsip berikutnya - mereka akan ditulis ke
Info.plist
, memungkinkan jika logika skrip yang ada untuk terus bekerja.Jawaban terperinci
Satu-satunya cara untuk mengubah sumber daya pada tindakan membangun adalah menggunakan
pre-action
skrip. Jika Anda mencoba melakukannya dari skrip build - perubahan tidak akan langsung berlaku dan tidak akan ada di akhir build / arsip.Untuk menambahkan tindakan pra-bangun - buka edit skema.
Kemudian perluas bagian Bangun dan Arsip. Di bawah
Pre-action
, klikProvide build and settings from
dropdown dan pilih sumber target kebenaran dari mana Anda ingin membaca nilainya.Tambahkan skrip berikut:
Baris skrip melakukan hal berikut:
MARKETING_VERSION
danCURRENT_PROJECT_VERSION
Langkah terakhir adalah menulis skrip sinkronisasi Anda sendiri yang membaca nilai yang disediakan
MARKETING_VERSION
danCURRENT_PROJECT_VERSION
untuk masing-masing target dan kapan pun Anda inginkan.Dalam kasus saya, skripnya adalah sebagai berikut:
Saya menggunakan shared
Info.plist
dan diSettings.bundle
antara kedua target aplikasi saya, jadi saya harus memperbarui ini sekali.Saya juga menggunakan ekstensi layanan notifikasi
BadgeCounter
, yang harus memiliki versi yang sama persis dan membangun sebagai target di mana ia tertanam. Jadi saya memperbarui ini juga.sumber
Jangan.
Agaknya ada alasan mengapa perilaku ini berubah. Jika nanti fitur Xcode membangun perilaku ini, semakin banyak hal yang "dikonstruksi" di telepon.
Alih-alih mencoba menekuk Xcode, ubah cara skrip build mengambil nilai-nilai ini:
Cara membaca versi aplikasi saat ini di Xcode 11 dengan skrip
Jika Anda perlu memanipulasi
project.pbxproj
file, itu adalah daftar gaya Next yang didokumentasikan dengan baik. Anda dapat menggunakanplistbuddy
yang kompatibel dengan format lama ini. Anda juga dapat menggunakanawk
skrip lebih banyak jika Anda memiliki manipulasi yang lebih kompleks.Jika saya mengerti kasus penggunaan Anda, Anda bisa menulis skrip yang mendapatkan nomor versi tertinggi
awk
dan kemudian memperbarui semua nomor versi yang lebih rendah yang dapat ditemukan dalam filesed
.sumber
PlistBuddy
tampaknya berfungsi dengan baik, tetapi ketika saya menggunakanset
perintah seluruh project.pbxproj akan dikonversi ke file .plist XML dan tidak lagi dapat dibaca oleh Xcode. contoh:PlistBuddy -c "Set :objects:$configurationId:buildSettings:CURRENT_PROJECT_VERSION $newProjectVersion" "$projectFile"
pbxproj
file akan membatalkan build. Jadi ini tidak benar-benar akan berhasil, saya takut.