Cara yang lebih baik untuk menambah nomor build?

133

Saya telah menggunakan skrip shell sebagai bagian dari proses pembuatan Xcode saya untuk menaikkan nomor build dalam file plist , namun itu membuat Xcode 4.2.1 sering crash (dengan kesalahan tentang target yang bukan milik sebuah proyek; Saya menebak mengubah file plist membingungkan Xcode dalam beberapa hal).

Skrip shell melakukan ini sehingga nomor build hanya bertambah agvtoolketika sebuah file lebih baru dari file plist (jadi hanya membangun tidak menambah nilainya):

if [ -n \"`find ProjDir -newer ProjDir/Project-Info.plist`\" ]; then agvtool -noscm next-version -all; else echo \"Version not incremented\"; fi

Apakah ada cara untuk menaikkan nomor build (di file plist , atau di mana pun) yang tidak merusak Xcode?

EDIT AKHIR : Sekarang saya melakukan hal-hal semacam ini menggunakan skrip python yang baru saja saya publikasikan di github . Ini tidak terdokumentasi dengan baik tetapi seharusnya tidak sulit untuk dikerjakan. Sebagai bonus, repo ini juga berisi skrip yang berguna untuk secara otomatis menggabungkan pustaka pihak ketiga ke dalam bundel aplikasi.

trojanfoe.dll
sumber
1
Jika ada yang tertarik: Saya memodifikasi skrip sedikit untuk menggunakan angka heksadesimal, bukan angka desimal - gist.github.com/sascha/5398750
Sascha
1
Anda dapat menambahkan skrip ini sebagai tindakan pra-build secara langsung, tidak perlu memanggil skrip eksternal. Jangan menjalankan skrip ini dengan fase build; Xcode hanya akan menyalin plist yang diperbarui setiap build lainnya.
Ed McManus
3
Di luar kotak saya mendapat kesalahan "izin ditolak" jadi saya pikir saya akan menunjukkan T&J ini kepada siapa pun yang mengalami hal yang sama: stackoverflow.com/q/9850936/519030
Jason
Skrip ini gagal dengan kode keluar 1. Adakah yang bisa membantu saya dengan ini?
Robert J. Clegg
@Tander Sepertinya Anda tidak memberikan file plist sebagai argumen ke skrip.
trojanfoe

Jawaban:

29

Jika saya memahami pertanyaan Anda dengan benar, Anda ingin mengubah Project-Info.plistfile, yang merupakan bagian dari template proyek standar Xcode?

Alasan saya menanyakan ini adalah karena Project-Info.plistbiasanya di bawah kontrol versi, dan memodifikasinya berarti akan ditandai sebagai, yah, dimodifikasi.

Jika Anda setuju, cuplikan berikut akan memperbarui nomor build dan menandai file sebagai diubah dalam proses, di mana get_build_numberada beberapa skrip (misalnya, placeholder dalam contoh ini) untuk mendapatkan nomor build (mungkin bertambah) yang Anda ingin menggunakan:

#!/bin/sh

# get_build_number is a placeholder for your script to get the latest build number
build_number = `get_build_number`

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${build_number}" ProjDir/Project-Info.plist

PlistBuddy memungkinkan Anda untuk mengatur kunci apa pun di file plist, bukan hanya nomor versi. Anda dapat membuat semua file plist yang diinginkan, dan memasukkannya ke dalam resource jika diperlukan. Mereka kemudian dapat dibaca dari bundel.

Mengenai kebutuhan Anda untuk menunjukkan versi di panel tentang dan tempat lain, Anda juga dapat melihat ke pengaturan CFBundleGetInfoStringdan CFBundleShortVersionString.

Monolo
sumber
Saya tidak memerlukan git komit (atau tag) di file plist sehingga sistem penambahan sederhana baik-baik saja (seperti yang disediakan oleh agvtool), namun tindakan memodifikasi plist selama build sering merusak Xcode (karena menghapus skrip yang tidak dimilikinya ' t macet sekali, saat macet setiap 3 bangunan atau lebih). Apakah mungkin untuk meletakkan info versi di file plist lain dan memasukkannya ke dalam bundel dan dapat diakses dari Aplikasi?
trojanfoe
Skrip yang bagus - Saya lebih suka menggabungkan ini dengan saran Hugues BR untuk hanya menggunakannya saat mengarsipkan build. Menjaga angkanya tetap rendah dan mengabaikan berapa pun build dev yang dilakukan di antara rilis.
Jay
5
Apa itu get_build_number? Apa itu hanya placeholder?
chrisp
Ya, get_build_numberhanya placeholder - memperbarui jawaban untuk memperjelas.
Monolo
73

Saya telah mengotak-atik banyak jawaban atas pertanyaan ini, dan tidak ada yang cukup memuaskan saya. Namun, saya akhirnya menemukan campuran yang sangat saya sukai!

Kami cukup menyetel nomor versi untuk produk yang dibangun ke jumlah Git commit. Ini tidak akan mengacaukan kontrol sumber Anda, karena skrip hanya memutasi produk yang dibuat.

Tambahkan fase build "Jalankan Skrip" ini ke akhir fase build Anda:

if [ "${CONFIGURATION}" = "Release" ]; then
    buildNumber=$(git rev-list --count head)
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
fi

Setel versi Info.plist Anda di proyek Anda ke apa pun yang Anda inginkan, itu tidak akan pernah digunakan saat membangun rilis rilis. Saya mengatur milik saya AUTOMATEDatau DEVELOPMENTjadi jelas ketika saya menjalankan pembangunan pembangunan.

Itu dia! Aplikasi yang dibangun akan memiliki nomor build yang terus meningkat. (Selama Anda selalu melakukan build dari cabang yang sama.)

Mengapa saya menyukai metode ini:

  • Mudah
  • Tidak mencemari riwayat versi Git
  • CFBundleVersion sepenuhnya otomatis
  • Nomor versi cantik dapat diubah kapan pun saya mau

Catatan lain:

  • Jika Anda memiliki ekstensi aplikasi dalam proyek Anda, cukup setel skrip build yang sama pada target tersebut juga. Ini akan membuat semua nomor versi otomatis dan sinkron. App Store membutuhkan versi ekstensi yang cocok dengan aplikasi utama Anda.
Wil Gieseler
sumber
Menyimpan nomor versi dari file plist yang dikontrol versi adalah cara terbaik untuk melakukannya, terutama jika Anda memiliki brach per rilis dan terkadang perlu menggabungkan atau memilih ceri. Terima kasih!
Matthew Phillips
15
Anda bisa menggunakan git rev-list --count HEADbukan git rev-list HEAD | wc -l | tr -d ' '.
kennytm
Hmm. Saya menemukan bahwa jika Anda menggunakan fastlaneuntuk mengupload build otomatis dengan cara ini, Anda akan mendapatkan: ERROR ITMS-90058: "Paket ini tidak valid. Nilai untuk CFBundleVersion [PENGEMBANGAN] kunci di file Info.plist harus berupa daftar yang dipisahkan oleh periode di kebanyakan tiga bilangan bulat non-negatif. "
fatuhoku
1
Saya tidak yakin ke mana harus pergi, saya meletakkan skrip pertama sebagai fase build pertama, dan skrip terakhir sebagai fase build terakhir dan berfungsi untuk saya.
Wil Gieseler
1
Anda pasti dapat menggunakan Info.plist menggunakan solusi ini - itulah intinya. Info.plist selalu disetel dan diperiksa dengan nomor versi disetel ke "PENGEMBANGAN", itu untuk sementara diubah selama proses pembangunan dan kemudian disetel ke "PENGEMBANGAN" lagi sehingga Info.plist stabil.
Wil Gieseler
38

Saya telah menggunakan glist ini. Ini bekerja seperti yang diharapkan. https://gist.github.com/sekati/3172554 (semua kredit diberikan kepada penulis asli)

Skrip yang saya modifikasi dari waktu ke waktu.

xcode-versionString-generator.sh ,

xcode-build-number-generator.sh

Karena inti ini membantu komunitas pengembang, saya membuat proyek GitHub darinya. Jadi mari kita kembangkan dengan baik. Ini adalah proyek GitHub: https://github.com/alokc83/Xcode-build-and-version-generator

Saya telah memperbarui kode untuk kedua skrip sedikit peningkatan. alih-alih menggunakan di bawah, ambil yang terbaru dari GitHub

Untuk Versi:

# xcode-version-bump.sh
# @desc Auto-increment the version number (only) when a project is archived for export. 
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Check the checkbox "Run script only when installing"
# 6. Drag the "Run Script" below "Link Binaries With Libraries"
# 7. Insure your starting version number is in SemVer format (e.g. 1.0.0)

# This splits a two-decimal version string, such as "0.45.123", allowing us to increment the third position.
VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
NEWSUBVERSION=`echo $VERSIONNUM | awk -F "." '{print $3}'`
NEWSUBVERSION=$(($NEWSUBVERSION + 1))
NEWVERSIONSTRING=`echo $VERSIONNUM | awk -F "." '{print $1 "." $2 ".'$NEWSUBVERSION'" }'`
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $NEWVERSIONSTRING" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Untuk membangun:

# xcode-build-bump.sh
# @desc Auto-increment the build number every time the project is run. 
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below into new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Ensure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
Alix
sumber
Ini akan selalu menaikkan nomor build, di mana seperti yang saya inginkan hanya untuk menambah jika file sumber berubah. Ini hanya skrip yang saat ini saya gunakan dengan lebih sedikit pemeriksaan keamanan dan kurang memahami apa yang telah berubah.
trojanfoe
XCode 5: Editor (bilah menu) → Tambahkan fase build → Tambahkan Salin File Fase Build:
Jonny
@trojanfoe: Anda dapat menjalankan skrip ini sebagai pengait pasca komit. Skenario ini hanya akan meningkatkan nomor build ketika Anda memasukkan kode Anda ke repo. Jawaban di bawah dari LostInTheTrees adalah sesuatu yang lain yang mungkin ingin Anda lakukan.
Alix
Skrip shell yang ditautkan oleh @Alix sekarang sangat berbeda dengan yang diposting di sini. Untuk menambah nomor build hanya saat melakukan pembuatan arsip, Anda dapat menggunakan inti yang telah saya buat, sangat banyak berdasarkan skrip Alix di atas, di sini: gist.github.com/mattpotts/abcffea6d08ad45739ef
Matius
14

Seluruh entri ini sangat membantu. Saya menggunakan trik ini tetapi menyiapkan skrip saya sebagai hook pasca-komit di GIT, jadi CFBundleVersion bertambah setelah setiap komit yang berhasil. Skrip hook masuk dalam .git / hooks. Sebuah log tertinggal di direktori proyek.

Ini memenuhi kriteria saya yang paling dasar. Saya ingin dapat menarik versi dari GIT dan membangun kembali bangunan yang sama seperti yang saya miliki sebelumnya. Setiap kenaikan yang dilakukan selama proses build tidak melakukan ini.

Ini skrip saya:

#!/bin/sh
#
# post-commit
#
# This script increments the CFBundleVersion for each successful commit
#

plist="./XYZZY/XYZZY-Info.plist"
buildnum=$(/usr/libexec/Plistbuddy -c "Print CFBundleVersion" "$plist")
if [ -z "$buildnum" ]; then
    exit 1
fi
buildnumplus=$(expr $buildnum + 1)
/usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnumplus" "$plist"

echo $(date) "- Incremented CFBundleVersion to" $buildnumplus >> hookLog.txt
LostInTheTrees
sumber
Saya memiliki persyaratan yang sama, itulah sebabnya nomor build hanya bertambah jika file sumber telah dimodifikasi. Saya telah menemukan ini bekerja dengan sangat baik dan tidak perlu membuat perubahan pada bump_build_number.shskrip sejak pembuatan.
trojanfoe
14

Saya tidak tahu cara mana yang terbaik, tetapi saya akan memposting jawaban Apple kalau-kalau ada yang mencarinya ...

Menurut posting Q&A Apple ini :

Mengotomatiskan Versi dan Bangun Nomor Menggunakan agvtool

Kunci nomor versi dan versi masing-masing menentukan versi pemasaran dan internal aplikasi Anda. agvtool adalah alat baris perintah yang memungkinkan Anda menaikkan angka-angka ini secara otomatis ke angka tertinggi berikutnya atau ke angka tertentu.

Nomor build mengidentifikasi versi aplikasi Anda yang belum atau sudah dirilis. Itu disimpan di Info.plist aplikasi Anda sebagai CFBundleVersion(versi Bundle).

Anda harus menyelesaikan langkah-langkah berikut dalam proyek Xcode Anda:

  1. Aktifkan agvtool

Buka panel Pengaturan Build target Anda, lalu perbarui untuk semua konfigurasi build Anda sebagai berikut:

  • Setel Versi Proyek Saat Ini ke nilai pilihan Anda.

File data project Xcode Anda, project.pbxproj, menyertakan CURRENT_PROJECT_VERSIONsetelan build (Versi Project Saat Ini), yang menentukan versi project Anda saat ini. agvtool mencari project.pbxproj untuk CURRENT_PROJECT_VERSION. Itu terus berjalan jika CURRENT_PROJECT_VERSIONada dan berhenti berjalan, jika tidak. Nilainya digunakan untuk memperbarui nomor build.

  • Setel Sistem Versi ke Apple Generic.

Secara default, Xcode tidak menggunakan sistem versi apa pun. Menyetel Sistem Versi ke Apple Generic memastikan bahwa Xcode akan menyertakan semua informasi versi yang dihasilkan agvtool dalam proyek Anda.

Setel Sistem Versi ke Apple Generic

  1. Siapkan versi Anda dan buat nomor

agvtool mencari Info.plist aplikasi Anda untuk versi dan nomor build. Itu memperbaruinya jika mereka ada dan tidak melakukan apa pun, sebaliknya. Pastikan bahwa kunci CFBundleVersion(versi Bundle) dan CFBundleShortVersionString(Bundle version string, short) ada di Info.plist Anda seperti yang terlihat pada gambar di bawah ini:

Siapkan versi Anda dan buat nomor

Keluar dari Xcode, lalu buka direktori yang berisi file proyek .xcodeproj Anda di aplikasi Terminal sebelum menjalankan salah satu perintah berikut. File proyek .xcodeproj berisi project.pbxproj, yang digunakan oleh agvtool. (Ini adalah bagian yang dapat Anda jalankan dalam skrip alih-alih baris perintah.)

Memperbarui Nomor Versi

Untuk memperbarui nomor versi ke versi tertentu, jalankan

xcrun agvtool new-marketing-version <your_specific_version>

Contoh: Perbarui nomor versi ke 2.0

xcrun agvtool new-marketing-version 2.0

Memperbarui Nomor Build

Untuk menaikkan nomor build Anda secara otomatis, jalankan

xcrun agvtool next-version -all

Untuk menyetel nomor versi aplikasi Anda ke versi tertentu, jalankan

xcrun agvtool new-version -all <your_specific_version>

Contoh: Setel nomor build ke 2.6.9

xcrun agvtool new-version -all 2.6.9

Bonus:

Untuk melihat nomor versi saat ini, jalankan

xcrun agvtool what-marketing-version

Untuk melihat nomor build saat ini, jalankan

xcrun agvtool what-version
FormigaNinja
sumber
7
Masalah dengan yang satu ini adalah agvtool akan membatalkan build xcode sehingga tidak dapat diintegrasikan sebagai skrip dalam fase build.
Daniel Schlaug
1
Tidak bisakah Anda menempatkan bump melalui agvtool dalam tindakan awal build skema?
lottadot
Saya menambahkannya sebagai skrip Pasca tindakan untuk membangun dalam skema. Dengan begitu, build akan bertambah setelah build berhasil dan tidak membatalkan build.
Chad
11

FWIW - inilah yang saat ini saya gunakan untuk meningkatkan jumlah build hanya untuk build rilis (yang mencakup pengarsipan). Bekerja dengan baik di bawah Xcode 5.1.

Cukup salin / tempel cuplikan ke fase pembuatan skrip Jalankan langsung di Xcode:

buildnum=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$PRODUCT_SETTINGS_PATH")

if [ "$CONFIGURATION" = "Release" ]; then
buildnum=$((buildnum + 1))
echo "Build number updated to $buildnum"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildnum" "$PRODUCT_SETTINGS_PATH"
fi;
Jay
sumber
Bagaimana Anda bisa menaikkan CFBundleVersion? Di Xcode 5.1 itu string yang diformat seperti "1.0"?
chrisp
1
Akhirnya seseorang melakukannya dengan benar :) Mengapa saya harus peduli dengan setiap build yang saya jalankan di perangkat dev saya? Rilis (dan rilis ke penguji) dihitung, bukan build "hmm, pindahkan 2 piksel itu ke kiri".
uvesten
7

Terima kasih untuk naskahnya. Ini bekerja dengan baik.

Info.plist saya berada dalam subdirektori dengan nama yang berisi spasi, jadi saya harus memodifikasi Run Script dengan tanda kutip di sekitar jalur plist:

${PROJECT_DIR}/tools/bump_build_number.sh "${PROJECT_DIR}/${INFOPLIST_FILE}"

dan skrip shell dengan cara yang sama dengan tanda kutip di semua jalur:

#!/bin/sh

if [ $# -ne 1 ]; then
    echo usage: $0 plist-file
    exit 1
fi

plist=$1
dir=$(dirname "$plist")

# Only increment the build number if source files have changed
if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
    buildnum=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$plist")
    if [ -z "$buildnum" ]; then
        echo "No build number in $plist"
        exit 2
    fi
    buildnum=$(expr $buildnum + 1)
    /usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "$plist"
    echo "Incremented build number to $buildnum"
else
    echo "Not incrementing build number as source files have not changed"
fi
massimobio
sumber
Ya itu masuk akal. Senang Anda menganggapnya berguna; Saya telah menggunakan sejak itu tanpa masalah sama sekali di bawah Xcode 4. {2,3,4,5}.
trojanfoe
Saya akan menghemat beberapa jam jika saya melihat jawaban ini! Selain itu, perhatikan bahwa nomor build hte tidak boleh memiliki desimal, atau BASH akan diakhiri.
Brenden
6

Skrip yang saat ini saya gunakan sangat banyak berdasarkan pada Alix , di atas. Adaptasi saya, di bawah, menambahkan centang untuk hanya melakukan penambahan otomatis pada rilis / pembuatan arsip.

Tanpa perubahan itu akan ada konflik kontrol versi karena setiap pengembang akan menaikkan nomor versi dengan kecepatan mereka sendiri. Dan fakta bahwa sejarah git akan tercemar secara tidak perlu dengan nomor build yang berubah sepanjang waktu.

# xcode-build-bump.sh
# @desc Auto-increment Xcode target build number every time the project is archived
# @src stackoverflow.com/a/15483906
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

if [ "Release" != "${CONFIGURATION}" ]
then
    exit 0
fi

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Ini juga tersedia (dalam format yang sedikit lebih mudah untuk disalin dan ditempel) sebagai inti GitHub .

Matthew
sumber
5

Saya akan merekomendasikan penggunaan autorevision .

Xcode memungkinkan file header (yang dapat dibuat secara otomatis pada waktu pembuatan dan bukan di vcs sendiri) untuk memberikan nilai yang akan diperluas di info.plist pada waktu pembuatan. Anda dapat menemukan panduan untuk menyiapkan ini di situs web autorevision .

Autorevision memiliki jenis keluaran yang diarahkan pada jenis file header ini untuk membantu dalam situasi ini.

dak180
sumber
1
Autorevisiontampaknya tidak menabrak nomor build, seperti yang diperlukan?
trojanfoe
Dengan asumsi bahwa seseorang hanya membangun komit baru maka VCS_NUMseharusnya apa yang Anda cari ( lihat autorevision.hcontoh ).
dak180
Vienna-Info.plist dan Vienna-All.xcconfig adalah contoh yang baik tentang bagaimana seseorang dapat mengatur ini di proyek xcode apa pun.
dak180
4

Satu masalah dengan beberapa solusi ini adalah bahwa Launch Services hanya mengenali empat lima digit utama dalam versi bundel . Saya memiliki proyek dengan nomor build yang jumlahnya ribuan, jadi saya ingin menggunakan beberapa digit yang kurang signifikan.

Skrip Perl ini menambah semua Info.plist dalam proyek, tidak hanya satu untuk target saat ini, jadi nomor build semua tetap terkunci. Ini juga menggunakan satu digit patch dan dua digit minor, jadi build 1234 diberikan versi 1.23.4. Saya menggunakannya sebagai perilaku pra-bangun, jadi ini berlaku untuk semua proyek yang saya bangun.

Skripnya cukup kasar, tetapi berhasil untuk saya.

#!/usr/bin/perl

use strict;
use warnings;
use v5.12.0;

use Dir::Iterate;

for my $plist_file(grepdir { /-Info.plist$/ } '.') {
    my $build = `/usr/libexec/PlistBuddy -c "Print CFBundleVersion" '$plist_file'`;
    chomp $build;

    next unless $build;

    # Strip dots
    $build =~ s/\.//g;
    $build =~ s/^0//g;

    # Increment
    $build++;

    # Re-insert dots
    $build =~ s/^(\d{0,4}?) (\d{0,2}?) (\d{0,1}?)$/$1.$2.$3/x;

    # Insert zeroes
    $build =~ s{(^|\.)\.}{${1}0.}g;

    system qq(/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build" '$plist_file');
}
Brent Royal-Gordon
sumber
Posting yang Anda kutip menyatakan bahwa ' Secara efektif, LS mengharapkan format berikut: nnnnn [.nn [.nn]] [X] di mana n adalah digit 0-9, tanda kurung siku menunjukkan komponen opsional, dan X adalah string apa pun yang bukan dimulai dengan digit. X diabaikan saat ada. '- jadi itu 99999 build. Haruskah cukup untuk sebagian besar proyek ..?
Jay
@Jay Saya tampaknya salah membaca itu sebagai empat digit. Ups. (Namun, jika gaya pengembangan Anda melibatkan banyak penyesuaian dan pembangunan kembali, bukan tidak terbayangkan bahwa Anda dapat mencapai 100.000 bangunan setelah bertahun-tahun mengembangkan sebuah proyek.)
Brent Royal-Gordon
@ BrentRoyal-Gordon Benar - Saya telah mengubah skrip build saya menjadi increment build hanya untuk konfigurasi rilis .. meskipun saya mungkin belum pernah mencapai hampir 10k build bahkan dengan produk lawas 10+ tahun saya, rasanya menyenangkan untuk memilikinya banyak ruang kepala dengan proyek Cocoa baru ;-)
Jay
4

Anda dapat menggunakan versi generik Apple . Pada dasarnya yang harus Anda lakukan adalah memanggil agvtool next-version -alldari dalam direktori yang menampung file .xcproj Anda. Untuk lebih jelasnya lihat url di atas.

Valentin Radu
sumber
3
Masalah dengan solusi ini adalah memanggil agvtool dari dalam skrip dalam proyek akan membatalkan build Anda. Ini bukan solusi yang baik kecuali Anda dapat menemukan solusi untuk ini.
Dan Loewenherz
3

Berdasarkan solusi Wil Gieseler , saya hanya memiliki satu perubahan yang ingin saya lakukan. Solusinya memasukkan hitungan git commit ke nomor build. Berguna, tetapi masih agak sulit untuk menemukan komitmen aktual yang menciptakan bangunan itu. Saya tidak terlalu peduli apakah nomor build meningkat secara monoton, jadi saya menghapus persyaratan itu sehingga saya dapat lebih mudah mengakses komit yang menghasilkan biner tertentu.

Untuk itu, saya memodifikasi skrip pertamanya menjadi berikut ini:

# Set the build number to the decimal conversion of the short version of the current git SHA

# Get the short version of the current git SHA in hexadecimal
SHA=$(git rev-parse --short @)
# Uppercase any alphabetic chars in SHA (bc doesn't like lowercase hex numbers)
UPPERCASE_SHA=$(tr '[:lower:]' '[:upper:]' <<< "$SHA")
# Use bc to convert the uppercase SHA from hex to decimal
BUILD_NUM=$(bc <<< "ibase=16;obase=A;$UPPERCASE_SHA")
# Set our build number to that
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUM" "${PROJECT_DIR}/${INFOPLIST_FILE}"

# To convert a build number back to a usable git SHA, run the following, substituting the build number for <build number>
# bc <<< "ibase=10;obase=16;<build number>"

Ini mengubah versi singkat dari git SHA saat ini menjadi desimal. Karakter heksadesimal tidak cocok dengan persyaratan nomor build Apple, itulah sebabnya saya harus melakukan ini. Untuk mengubahnya kembali, Anda cukup menjalankan sesuatu seperti ini:

SHA=$(bc <<< "ibase=10;obase=16;<build number>")

di bash, di mana <build number>nomor build yang Anda dapatkan dari biner. Lalu, lari saja git checkout $SHA, dan itu dia.

Karena ini merupakan adaptasi dari solusi Wil Gieseler , seperti yang disebutkan di atas, Anda juga memerlukan skrip pasca-pembuatan berikut:

# Set the build number to "DEVELOPMENT"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"

yang membuat riwayat git Anda bersih.

ravron
sumber
Jadi bagaimana cara kerjanya, mengingat Anda akan menulis info git Info.plist, yang dilacak oleh git?
trojanfoe
@trojanfoe Seperti yang saya sebutkan di bagian atas jawaban, jawaban ini adalah adaptasi dari solusi Wil Gieseler. Karena itu, diperlukan skrip pasca-build yang sama yang digunakan di sana. Saya telah menambahkan itu ke jawaban secara eksplisit.
ravron
2

Saya mencoba prosedur yang dimodifikasi dan tidak berhasil, karena: -

  1. Xcode 4.2.1 mengubah subdirektori xcuserdata di .xcodeproj

  2. git mencatat perubahan sebelumnya di Project-Info.plist

Modifikasi berikut menyebabkan ini diabaikan dan hanya menandai perubahan asli: -

if [ -n "$(find $dir \! -path "*xcuserdata*" \! -path "*.git" -newer $plist)" ]; then
Miliways
sumber
2

Anda mungkin ingin melakukan ini hanya ketika Anda mengarsipkan (dan mengunggah ke TF misalnya). Jika tidak, nomor versi Anda mungkin naik sangat cepat ..

Dalam skema (Produk / Edit Skema / Arsip / Pra-Tindakan) Anda dapat menambahkan skrip yang akan dijalankan hanya ketika Anda mengarsipkan.

Selain itu, Anda mungkin ingin menyetel ulang nomor versi setiap kali Anda menaikkan versi aplikasi.

Terakhir, jika Anda menggunakan arsip, Anda dapat menonaktifkannya dengan aman:

# if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
...
# else
    # echo "Not incrementing build number as source files have not changed"
# fi

Karena nomor build akan bertambah hanya saat Anda mengarsipkan ...

EDIT: Perbaiki apa yang saya katakan, tindakan awal dalam arsip terjadi setelah build (tetapi sebelum pengarsipan), jadi nomor build akan bertambah untuk arsip berikutnya ... Tetapi Anda dapat membuat skema baru dan menambahkan tindakan ini dalam build (pra- tindakan) dari skema baru ini. dan gunakan skema ini saat Anda ingin membuat build baru

Hugues BR
sumber
1
Ya, itu meningkat dengan cepat (5500+ saat ini), tetapi itu bukan masalah bagi saya; itu hanya angka. Sungguh menarik berapa kali Cmd-B / Cmd-R tertabrak sebelum apa pun berfungsi ...
trojanfoe
2

Saya menggunakan revisi SVN terakhir untuk nomor build. Jika Anda mengubah Info.plist di direktori build, Anda tidak akan memengaruhi Info.plist sumber:

# use the last SVN revision as the build number:
Info_plist="$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Info.plist"
defaults write "${Info_plist}" CFBundleVersion `svn stat -u | awk '/'"Status against revision:"'/ {print $4}'`
mendongkrak
sumber
2

Saya merasa seperti saya telah menemukan suku saya. Tribe, saya harap Anda terhibur dengan VersionX.

Satu dekade yang lalu saat mengerjakan ruang kerja yang memiliki lebih dari 25 proyek Xcode di dalamnya, saya mengambil kesempatan untuk mengotomatiskan versi dan membangun pembaruan string ke tingkat yang mungkin tampak tidak masuk akal, jika Anda hanya mempertahankan satu atau dua proyek dengan pembaruan sesekali.

VersionX:

  • mengetahui jenis build (Release / Debug)
  • mengumpulkan informasi pada waktu pembuatan dari repositori (termasuk dukungan git, tetapi dapat disesuaikan untuk hg, svn, atau apa pun yang Anda gunakan)
  • disediakan untuk string versi pemasaran mewah yang dapat disesuaikan dengan mudah (yang memiliki lebih banyak variasi sebelum App Store memberlakukan konvensi) sehingga Anda dapat menambahkan string secara otomatis yang menyertakan simbol untuk "beta" menggunakan konvensi git tag, misalnya.
  • termasuk kelas yang diisi dengan variabel instan yang berisi versi dan informasi komit. Ini berguna untuk mengisi panel about Anda dan membuat string logging, laporan kerusakan, atau laporan bug email pengguna dengan informasi yang telah diisi sebelumnya.

Itu menyenangkan untuk dibuat. Saya belajar banyak tentang sistem build Xcode.

Berikut adalah contoh jenis string Versi dan Build yang canggih yang dapat dibuat oleh VersionX secara otomatis.

VersiX 1.0.1 β7 (c5959a3 "Bersih")

Versi Pemasaran: VersionX 1.0.1 β7 "1.0.1 diturunkan dari tag untuk komit, sedangkan" Beta 7 "secara otomatis dihasilkan oleh jumlah komit, atau jumlah versi (misalnya).

Versi Build: (c5959a3 “Clean”) Menampilkan hash komit singkat, dan memberi tahu Anda bahwa direktori build tidak memiliki perubahan yang belum dilakukan.

VersionX (sumber di GitHub) - sistem barok untuk menambahkan versi secara otomatis dan membangun string dalam proyek Xcode.

Dokumentasi VersionX.

Gary W. Longsine
sumber
1

Anda mungkin ingin memeriksa alat baru yang telah saya kembangkan bernama Xcodebump. Ini dapat menangani pembaruan CFBundleShortVersionString dan CFBundleVersion. Sebagai langkah terakhir, ini juga akan memeriksa git dan memberi tag pada komit untuk menyesuaikan dengan nilai CFBundle tersebut.

Itu Xcodebump terletak di sini:

https://github.com/markeissler/Xcodebump

markeissler
sumber
1

Saya memperbarui build number dengan metode berikut.

$INFO_FILEadalah jalur dari file plist. Dan $build_numbermerupakan nomor build baru untuk gedung ini.

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build_number" "${INFO_FILE}"

Umumnya, my $build_numberterdiri dari majordan minorbagian. Ini minorberasal dari informasi proyek. Jadi saya menjelaskan cara menghasilkan majorbagian tersebut.

## Composed by `major` and `minor`. 
## `minor` is parsed from project information. It's another story.
## Examples: `21.1`, or `21.1.3`
build_number="${major_number}.${minor_number}"

Saya memiliki 2 strategi untuk memutuskan $build_number .

Strategi Pertama

Strategi ini menggunakan git taghitungan untuk memutuskan majordari build number. Jika ada 53tag proyek, itu akan kembali 53dengan mengikuti skrip shell.

Umumnya meningkat. Dan itu akan memaksa pengembang untuk meletakkan tag git sebelum menerbitkan.

major_number=$(git tag -l | wc -l | grep -oE "\d+")

Strategi Kedua

Biarkan sistem Jenkins CI yang menentukan majorbagiannya. Ini memiliki variabel lingkungan BUILD_NUMBER. Ini meningkat secara otomatis saat membangun di sistem CI. Informasi ini berguna untuk menelusuri riwayat proyek pada sistem CI.

major_number=${BUILD_NUMBER}
AechoLiu
sumber
1

Berikut versi yang diperbarui. Ini berfungsi pada Xcode 9.3.1, iOS 11.

Klik 'Build Phases' dari target aplikasi Anda, klik ikon + untuk menambahkan skrip proses baru, dan di dalam kotak, tempel kode ini.

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Masuk ke file Info.plist dan atur 'Bundle version' menjadi 1, dan 'Bundle version string, short' to 1, Anda harus disetel.

Bangun proyek dengan Info.plist dalam tampilan, dan Anda akan melihat versi Bundle (nomor Build) berubah.

  • Perhatikan bahwa pada Xcode 9.3.1, Anda tidak akan dapat melihat perubahan ini dari tab umum, tetapi akan melihat perubahan saat Anda mengarsipkan build, dan di Info.plist
L. Davis
sumber
0

Inilah solusi saya. Jika Anda seperti saya: ramah terminal, seperti ruby, seperti pembuatan versi semantik, coba ini.

Buat file bernama Rakefileyang berisi ini:

require "xcodeproj"
require "versionomy"

XCODEPROJECT = "MyProject.xcodeproj"
INFOPLISTFILE = "MyProject/MyProject-Info.plist"

$UPDATES = [:major,:minor,:tiny]
$UPDATES.each { |part|
  desc "increment #{part} part of version"
  task "increment:#{part}" do |task|
    version=`/usr/libexec/Plistbuddy -c "Print CFBundleVersion" #{INFOPLISTFILE}`.chomp
    version=Versionomy.parse(version)
    version=version.bump(part)

    # I use the same string for CFBundleVersion and CFBundleShortVersionString for now
    `/usr/libexec/PlistBuddy -c "Set :CFBundleVersion #{version}" #{INFOPLISTFILE}`
    `/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString #{version}" #{INFOPLISTFILE}`
    print "version upgraded to #{version}\n"
  end
}

Mempersiapkan: gem install xcodeproj versionomy

Jalankan: rake increment:majoratau rake increment:minoratau rake increment:tinykapanpun Anda inginkan.

mash
sumber
0

Saya merasa paling nyaman menggunakan Automating Version dan Build Numbers Menggunakan agvtool .

Coba ini:

  1. Konfigurasikan seperti yang dijelaskan dalam dokumentasi Apple yang ditautkan di atas.
  2. Tambahkan skrip sebagai Pra-tindakan ke Proyek -> Edit Skema ... -> Arsip (atau lainnya jika Anda lebih suka)
  3. Set: Menyediakan pengaturan build dari <your_app_target>

Skrip (baris pertama opsional):

exec > ${PROJECT_DIR}/prebuild.log 2>&1
cd ${PROJECT_DIR}
xcrun agvtool next-version -all
cd -
goce
sumber
0

Mari lakukan ini dengan cara Apple sendiri. Ini akan meningkatkan nomor build setelah setiap build berhasil

Saya akan memandu Anda melalui 5 gambar, cukup lihat saja.

  1. Pilih 'Edit Scheme ...' dari dropdown, saat Anda memilih nama Proyek Anda yang terletak di sisi kanan tombol Stop_build_button. Periksa Langkah Pertama

  2. Dari menu leftSide perluas opsi 'Build' dan pilih 'Post-actions' Periksa Langkah Kedua

  3. Di sini Anda dapat menambahkan Kode (Skrip) yang Anda inginkan yang ingin Anda jalankan setelah berhasil membangun program Anda. Ini adalah tempat di mana kita harus menambahkan sedikit kode untuk membuat otomatisasi kita bekerja dengan sempurna. >> 1. pilih tombol 'add (+)' dari pojok kiri untuk menambahkan file script baru >> 2. Sekarang dari drop down pilih 'New Run Script Action' Periksa Langkah Ketiga

  4. Ini memiliki 3 bidang >> 1. shell sudah ditetapkan untuk Anda >> 2. sekarang untuk 'Berikan Anda membangun pengaturan dari' Pilih Nama Proyek Anda. >> 3. Ada bidang besar untuk menambahkan Script Anda, cukup salin dan tempel kode ini di sana: Periksa Langkah Keempat

    PLIST = "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}" PLB = / usr / libexec / PlistBuddy LAST_NUMBER = $ ($ PLB -c "Cetak CFBundleVersion" "$ PLIST") NEW_VERSION = $ (($ LAST_NUMBER + 1)) $ PLB -c "Set: CFBundleVersion $ NEW_VERSION" "$ PLIST"

  5. Setelah menyelesaikan langkah ke-4 pilih saja 'Tutup' untuk menutup jendela dan kita harus melakukan langkah terakhir, Goto file 'plist.info' Anda di menu file Proyek dan pastikan tombol 'Versi Bundel' di bawah Bagian 'Kunci' paling banyak berisi Langkah Kelima Pemeriksaan Nilai Numerik

Debashish Das
sumber