Yapı numarasını artırmanın daha iyi bir yolu var mı?


133

Ben plist dosya içinde yapı numarasını artırmak için benim Xcode derleme sürecinin bir parçası olarak bir kabuk komut dosyası kullanıyorum , ancak sık sık Xcode 4.2.1 çökme yapıyor (bir projeye ait olmayan hedef hakkında bir hata ile; Tahmin ediyorum) plist dosyasının değiştirilmesi Xcode'u bir şekilde karıştırmaktadır).

Kabuk betiği, yapı numarası yalnızca agvtoolbir dosya plist dosyasından daha yeni olduğunda artar (böylece sadece bina değeri artırmaz).

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

Xcode'u kırmayan yapı numarasını ( plist dosyasında veya başka bir yerde) artırmanın bir yolu var mı?

NİHAİ DÜZENLEME : Şimdi bu tür şeyleri github'da halka açtığım bir python betiği kullanarak yapıyorum . İyi belgelendirilmemiş, ancak çalışması zor olmamalı. Bonus olarak, bu repo ayrıca 3. taraf kitaplığını otomatik olarak bir uygulama paketine paketlemek için kullanışlı bir komut dosyası içerir.


1
Eğer ilgilenen varsa: Ondalık sayılar yerine onaltılık sayılar kullanmak için komut dosyasını biraz değiştirdim - gist.github.com/sascha/5398750
Sascha

1
Bu komut dosyasını doğrudan derleme öncesi eylem olarak ekleyebilirsiniz, harici bir komut dosyası çağırmanıza gerek yoktur. Bu komut dosyasını oluşturma aşamasıyla çalıştırmayın; Xcode sadece güncellenen plist'i diğer tüm yapılara kopyalar.
Ed McManus

3
Kullanıma hazır "izin reddedildi" hatası aldım, bu yüzden bu soru ve
Jason

Bu komut dosyası bir çıkış kodu 1 ile başarısız oluyor. Birisi bana bu konuda yardımcı olabilir mi?
Robert J. Clegg

@Tander plist dosyasını betiğe argüman olarak vermiyorsunuz.
trojanfoe

Yanıtlar:


29

Sorunuzu doğru Project-Info.plistanlarsam, Xcode'un standart proje şablonunun bir parçası olan dosyayı değiştirmek ister misiniz ?

Bunu sormamın nedeni, Project-Info.plistnormalde sürüm kontrolü altında olması ve değiştirilmesi, değiştirilmiş olarak işaretleneceği anlamına gelir.

Bu sizin için uygunsa, aşağıdaki snippet, derleme numarasını güncelleyecek ve dosyayı işlemde değiştirilmiş olarak işaretleyecektir, buradaki get_build_number(muhtemelen artmış) derleme numarasını almak için bazı komut dosyası (bu örnekte yer tutucu) kullanmak istemek:

#!/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, sadece sürüm numarasını değil, bir plist dosyasında herhangi bir anahtarı ayarlamanıza izin verir. İstediğiniz tüm plist dosyalarını oluşturabilir ve gerekirse bunları kaynaklara dahil edebilirsiniz. Daha sonra paketten okunabilirler.

Bölmesinde ve diğer yerler hakkında sürümü göstermek için ihtiyaca olarak ayrıca ortama bakabilirsiniz CFBundleGetInfoStringve CFBundleShortVersionString.


Basit bir artan sistem (tarafından sağlanan ) iyi, ancak plist dosyasında git kesinti (veya etiketi) gerekmez agvtool, ancak plist oluşturma sırasında plist sık sık değiştirme (çünkü o komut dosyasını kaldırma beri t her 3 yapıda bir çöktüğünde, bir kere çöktü). Sürüm bilgisini başka bir plist dosyasına koymak ve pakete dahil olan ve Uygulamadan erişilebilir olmasını sağlamak mümkün mü?
trojanfoe

Harika senaryo - Bunu sadece arşivleri oluştururken kullanmak için Hugues BR'nin önerisiyle birleştirmeyi tercih ederim . Sayıları düşük tutar ve yok sayar, ancak sürümler arasında birçok geliştirme oluşturulur.
Jay

5
Get_build_number nedir? Bu sadece bir yer tutucu mu?
chrisp

Evet, get_build_numbersadece bir yer tutucudur - açıklığa kavuşturmak için cevabı güncelledi.
Monolo

72

Bu sorunun cevabını çok karıştırdım ve hiçbiri beni tatmin etmedi. Ancak, sonunda gerçekten sevdiğim bir karışım buldum!

Biri yapım aşamalarınızın başında ve diğeri başında olmak üzere iki adım vardır.

Başlangıçta:

# Set the build number to the count of Git commits
if [ "${CONFIGURATION}" = "Release" ]; then
    buildNumber=$(git rev-list HEAD | wc -l | tr -d ' ')
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
fi

Sonunda:

# Set the build number to "DEVELOPMENT"
if [ "${CONFIGURATION}" = "Release" ]; then
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"
fi

Xcode'daki Info.plist'e baktığınızda sürüm numarasının "DEVELOPMENT" olduğunu göreceksiniz, ancak yerleşik uygulama sürekli artan bir yapı numarasına sahip olacak. (Yapılarınızı her zaman aynı dalda yaptığınız sürece.)

Sürüm numarasının sonunda sabit bir dizeye geri ayarlanması, Info.plist dosyasının uygulamayı oluşturarak değiştirilmesini önler.

Neden bu yöntemi seviyorum:

  • Kolay
  • Git sürüm geçmişini kirletmez
  • CFBundleVersion tamamen otomatik
  • Güzel sürüm numarası istediğim zaman değiştirilebilir

Sürüm numaralarını sürüm kontrollü plist dosyasından uzak tutmak, özellikle sürüm başına bir paranız varsa ve bazen birleştirmek veya kiraz almak zorunda kalmanız durumunda bunu yapmanın en iyi yoludur. Teşekkürler!
Matthew Phillips

14
Bunun git rev-list --count HEADyerine kullanabilirsiniz git rev-list HEAD | wc -l | tr -d ' '.
kennytm

Hmm. fastlaneOtomatik derlemeleri bu şekilde yüklemek için kullanırsanız , şunu elde ettiniz: ERROR ITMS-90058: "Bu paket geçersiz. Info.plist dosyasında anahtar CFBundleVersion [DEVELOPMENT] değeri, en çok üç negatif olmayan tam sayı. "
fatuhoku

1
Tam olarak nereye gitmesi gerektiğinden emin değilim, ilk betiği ilk derleme aşamasına, son betiği de son derleme aşamasına koydum ve benim için çalışıyor.
Wil Gieseler

1
Bu çözümü kullanarak Info.plist'i kesinlikle uygulayabilirsiniz - tüm mesele budur. Info.plist her zaman sürüm numarası "DEVELOPMENT" olarak ayarlanmış olarak ayarlanır ve kontrol edilir, derleme işlemi sırasında geçici olarak değiştirilir ve daha sonra tekrar "DEVELOPMENT" olarak ayarlanır, böylece Info.plist sabit kalır.
Wil Gieseler

38

Bu parıltıyı kullandım. Beklendiği gibi çalışır. https://gist.github.com/sekati/3172554 (tüm kredi asıl yazara aittir)

Zaman içinde değiştirdiğim komut dosyaları.

xcode-versionString-generator.sh ,

xcode-build-number-generator.sh

Bu özü geliştirici topluluğa yardım ederken, GitHub projesini bundan çıkardım. Öyleyse iyi geliştirelim. İşte GitHub projesi: https://github.com/alokc83/Xcode-build-and-version-generator

Her iki komut dosyasının kodunu biraz geliştirdim. Aşağıda kullanmak yerine GitHub'dan en son bilgileri alın

Sürüm için:

# 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}"

Yapı için:

# 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}"

Bu her zaman derleme numarasını arttıracaktır , burada istediğim gibi sadece bir kaynak dosya değiştiğinde artmasını istiyorum. Sadece şu anda daha az güvenlik denetimi ile kullandığım komut dosyası ve değişen şeyleri daha az ayırt ediyor.
trojanfoe

XCode 5: Editör (menü çubuğu) → Derleme aşaması ekle → Kopya Dosyaları Ekle Derleme Aşaması:
Jonny

@trojanfoe: Bu komut dosyasını gönderim sonrası kanca olarak çalıştırabilirsiniz. Bu senaryo, yalnızca kodunuzu repo yapmaya karar verdiğinizde yapı numarasını artıracaktır. Aşağıdaki LostInTheTrees'ten cevap, yapmak isteyebileceğinizden daha fazlasıdır.
Alix

@Alix tarafından bağlanan kabuk betikleri artık burada yayınlananlardan oldukça farklı. Derleme numarasını yalnızca bir arşiv derlemesi yaparken artırmak için, yukarıdaki Alix'in
Matthew

14

Bütün bu giriş son derece yararlı oldu. Bu hileyi kullandım ama senaryomu GIT'te bir post-taahhüt kanca olarak ayarladım, bu nedenle CFBundleVersion her başarılı işlemden sonra artırıldı. Kanca komut dosyası .git / kancalar içine girer. Proje dizininde bir günlük bırakılır.

Bu benim en temel ölçütümü karşılıyor. GIT'den bir sürüm alabilmek ve daha önce yaptığım yapıyı yeniden oluşturmak istiyorum. Oluşturma işlemi sırasında yapılan herhangi bir artış bunu yapmaz.

İşte benim senaryom:

#!/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

Yapı numarası yalnızca bir kaynak dosya değiştirildiyse bu nedenle artırılır aynı gereksinimi var . Bunu çok iyi buldum ve bump_build_number.shyaratılıştan bu yana senaryoda değişiklik yapmak zorunda kalmadım.
trojanfoe

14

Hangi yolun en iyisi olduğunu bilmiyorum, ancak herhangi birinin araması durumunda Apple'ın cevabını göndereceğim ...

Bu Apple'ın Soru-Cevap gönderisine göre :

Agvtool Kullanarak Sürüm ve Derleme Numaralarını Otomatikleştirme

Sürüm ve yapı numarası anahtarları sırasıyla uygulamanızın pazarlama ve dahili sürümlerini belirtir. agvtool, bu sayıları otomatik olarak bir sonraki en yüksek sayıya veya belirli bir sayıya yükseltmenizi sağlayan bir komut satırı aracıdır.

Derleme numarası, uygulamanızın yayınlanmamış veya yayınlanmış bir sürümünü tanımlar. Uygulamanızın Info.plist uygulamasında CFBundleVersion(Paket sürümü) olarak depolanır .

Xcode projenizde aşağıdaki adımları tamamlamanız gerekir:

  1. Agvtool'u etkinleştir

Hedefinizin Oluşturma Ayarları bölmesine gidin, ardından tüm oluşturma yapılandırmalarınız için aşağıdaki gibi güncelleyin:

  • Geçerli Proje Sürümü'nü istediğiniz bir değere ayarlayın.

Xcode proje veri dosyanız, project.pbxproj, CURRENT_PROJECT_VERSIONprojenizin geçerli sürümünü belirten bir (Geçerli Proje Sürümü) oluşturma ayarı içerir. agvtool project.pbxproj dosyasını arar CURRENT_PROJECT_VERSION. Varsa çalışmaya devam eder CURRENT_PROJECT_VERSIONve aksi halde çalışmayı durdurur. Değeri derleme numarasını güncellemek için kullanılır.

  • Sürüm Sistemini Apple Generic olarak ayarlayın.

Varsayılan olarak, Xcode herhangi bir sürüm sistemi kullanmaz. Sürüm Sistemini Apple Generic olarak ayarlamak, Xcode'un projenizde agvtool tarafından üretilen tüm sürüm bilgilerini içermesini sağlar.

Sürüm Sistemini Apple Generic olarak ayarlama

  1. Sürümünüzü ve yapı numaralarınızı ayarlayın

agvtool, uygulamanızın Info.plist'ini sürümünüz ve yapı numaralarınız için arar. Varsa onları günceller ve hiçbir şey yapmaz, aksi takdirde. Aşağıdaki pakette görüldüğü gibi Info.plist'inizde CFBundleVersion(Paket sürümü) ve CFBundleShortVersionString(Paket sürümleri dizesi, kısa) tuşlarının bulunduğundan emin olun :

Sürümünüzü ve yapı numaralarınızı ayarlayın

Xcode'dan çıkın ve aşağıdaki komutlardan herhangi birini çalıştırmadan önce Terminal uygulamasında .xcodeproj proje dosyanızı içeren dizine gidin. .Xcodeproj proje dosyası agvtool tarafından kullanılan project.pbxproj dosyasını içerir. (Komut satırı yerine komut dosyasında çalıştırabileceğiniz bölüm budur.)

Sürüm Numarasını Güncelleme

Sürüm numarasını belirli bir sürüme güncellemek için şunu çalıştırın:

xcrun agvtool new-marketing-version <your_specific_version>

Örn: Sürüm numarasını 2.0 olarak güncelleyin

xcrun agvtool new-marketing-version 2.0

Derleme Numarasını Güncelleme

Yapı numaranızı otomatik olarak artırmak için,

xcrun agvtool next-version -all

Uygulamanızın derleme numarasını belirli bir sürüme ayarlamak için şunu çalıştırın:

xcrun agvtool new-version -all <your_specific_version>

Örn: Derleme numarasını 2.6.9 olarak ayarlayın

xcrun agvtool new-version -all 2.6.9

Bonus:

Geçerli sürüm numarasını görüntülemek için şunu çalıştırın:

xcrun agvtool what-marketing-version

Mevcut yapı numarasını görüntülemek için,

xcrun agvtool what-version

7
Bu bir sorun agvtool xcode derlemeyi durduracak, bu yüzden derleme aşamalarında bir betik olarak entegre edilemez.
Daniel Schlaug

1
Planın derleme ön eylemlerine agvtool ile çarpabilir misiniz?
lottadot

11

FWIW - şu anda sadece sürüm derlemeleri için (arşivlemeyi de içeren) derleme sayısını artırmak için kullanıyorum . Xcode 5.1 altında iyi çalışır.

Parçacığı doğrudan Xcode'da bir Run komut dosyası oluşturma aşamasına kopyalayın / yapıştırın :

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;

CFBundleVersion'u nasıl artırabilirsiniz? Xcode 5.1 'de "1.0" gibi biçimlendirilmiş bir dize?
chrisp

1
Sonunda birisi doğru yapıyor :) Neden dev cihazımda çalıştırdığım her yapıyı umursamalıyım? Sürümler (ve test kullanıcılarına sürümler) "hmm, bu 2px'i sola taşı" değil sayılır.
uvesten

7

Senaryo için teşekkürler. Harika çalışıyor.

Benim Info.plist boşluk içeren bir adla bir alt dizinde olduğunu, bu yüzden plist yolu çevresinde tırnaklarla Komut Dosyası Çalıştırmak zorunda kaldım:

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

ve kabuk komut dosyasını tüm yollarda tırnak işaretleri ile aynı şekilde:

#!/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

Evet bu mantıklı. Yararlı bulmanıza sevindim; O zamandan beri Xcode 4 altında hiç sorun yaşamadım. {2,3,4,5}.
trojanfoe

Bu cevabı görürsem kendimi birkaç saat kurtarabilirdim! Ayrıca, hte derleme numarasının ondalık sayıya sahip olmaması gerektiğini veya BASH'in kırıldığını unutmayın.
Brenden

6

Şu anda kullandığım komut dosyası yukarıda Alix'lere dayanmaktadır . Aşağıdaki uyarlamam, yalnızca bir serbest bırakma / arşiv yapısında otomatik artırmayı yapmak için bir kontrol ekler.

Bu değişiklik olmadan, her geliştirici derleme numarasını kendi hızında artıracağından sürüm kontrol çakışmaları olacaktır. Ve git tarihinin her zaman değişen yapı numarasıyla gereksiz yere kirleneceği gerçeği.

# 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}"

GitHub özeti olarak da (kopyalamak ve yapıştırmak biraz daha kolay) mevcuttur .


5

Autorevision kullanımını tavsiye ederim .

Xcode, üstbilgi dosyasına (derleme zamanında otomatik olarak oluşturulabilir ve vcs içinde değil kendiliğinden oluşturulabilir) derleme zamanında info.plist'de genişletilecek değerler sağlar. Bunu ayarlamak için autorevision web sitesinde bir yol bulabilirsiniz .

Otomatik kayıt, tam olarak bu durumlarda yardımcı olmak için bu tür başlık dosyalarına yönelik bir çıktı türüne sahiptir.


1
Autorevisiongerektiği gibi bir yapı numarası çarpmıyor gibi görünüyor mu?
trojanfoe

Birinin sadece yeni bir taahhüt üzerine kurulu olduğunu varsayarsak VCS_NUM, aradığınız şey bu olmalıdır ( bir örnek için bakınızautorevision.h ).
dak180

Vienna-Info.plist ve Vienna-All.xcconfig , bunu herhangi bir xcode projesinde nasıl ayarlayabileceğinize iyi bir örnektir.
dak180

4

Bu çözümlerin bazılarıyla ilgili bir sorun, Launch Services'ın paket sürümünde yalnızca dört beş büyük haneyi tanımasıdır . Binlerce derleme numarası olan bir projem var, bu yüzden daha az önemli basamaklardan bazılarını kullanmak istedim.

Bu Perl betiği, yalnızca geçerli hedef için değil, projedeki tüm Info.plist'leri arttırır, böylece yapı numaraları kilitli kalır. Ayrıca bir yama basamağı ve iki küçük basamak kullanır, bu nedenle yapı 1234'e sürüm 1.23.4 verilir. Yapım öncesi bir davranış olarak kullanıyorum, bu yüzden yaptığım tüm projeler için geçerli.

Senaryo oldukça kaba kuvvet, ama benim için çalışıyor.

#!/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');
}

Alıntı yaptığınız gönderi, ' Etkili, LS'nin aşağıdaki biçimi beklediğini belirtir: nnnnn [.nn [.nn]] [X] burada n, 0-9 arası bir basamaktır, köşeli parantezler isteğe bağlı bileşenleri belirtir ve X, herhangi bir dize değildir bir rakam ile başlayarak. Var olduğunda X önemsenmez. '- Yani bu 99999 yapı. Çoğu proje için yeterli olmalı ..?
Jay

@ Görünüşe göre bunu dört basamaklı olarak yanlış okudum. Hata. (Yine de, geliştirme tarzınız çok sayıda ince ayar ve yeniden oluşturma içeriyorsa, bir projede yıllarca süren geliştirmeden sonra 100.000 yapıya ulaşmanız akıl almaz değildir.)
Brent Royal-Gordon

@ BrentRoyal-Gordon True - Yapı betiğimi yalnızca sürüm yapılandırmaları için yapıları artırmak için ayarladım .. 10+ yıllık eski ürünümle bile muhtemelen 10k yapıların yakınında hiçbir yere ulaşmamış olmama rağmen, iyi hissettiriyor yeni Kakao projeleri ile kafa odası bir sürü ;-)
Jay

4

Apple'ın genel sürümlemesini kullanabilirsiniz . Temel olarak yapmanız gereken tek şey agvtool next-version -all.xcproj dosyanızı barındıran dizinden aramaktır. Daha fazla ayrıntı için yukarıdaki URL'ye göz atın.


3
Bu çözümdeki sorun, projedeki bir komut dosyasından agvtool çağırmanın derlemenizi iptal etmesidir. Bunun için bir çözüm bulamazsanız iyi bir çözüm değildir.
Dan Loewenherz

3

Bina Wil Gieseler çözümüyle , ben yapmak istedim sadece bir değişiklik vardı. Onun çözümü git taahhüdünün sayısını yapı numarasına koyar. Yararlı, ama yine de bu yapıyı oluşturan gerçek taahhüdü bulmak için bir acı. Yapı sayısının monoton olarak artmakta olup olmadığını çok fazla umursamadım ve bu nedenle, belirli bir ikili kod oluşturan taahhüde daha kolay erişebilmek için bu gereksinimi bıraktım.

Bu amaçla, ilk senaryosunu şu şekilde değiştirdim:

# 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>"

Bu, geçerli git SHA'nın kısa sürümünü ondalığa dönüştürür. Onaltılık karakterler Apple'ın yapı numarası gereksinimleriyle iyi oynamıyor, bu yüzden bunu yapmak zorunda kaldım. Geri dönüştürmek için şöyle bir şey çalıştırmanız yeterlidir:

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

bash içinde, <build number>bir ikili dosyadan aldığınız yapı numarası. Sonra, sadece koş git checkout $SHA, ve işte gidiyorsun.

Bu, yukarıda belirtildiği gibi Wil Gieseler'in çözümünün bir uyarlaması olduğundan , aşağıdaki derleme sonrası komut dosyasına da ihtiyacınız olacak:

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

bu da git geçmişinizi temiz tutar.


Peki, git bilgisini içine yazacağınız göz önüne alındığında, bu nasıl çalışır, git git Info.plisttarafından izlenir?
trojanfoe

@trojanfoe Cevabın en üstünde belirttiğim gibi, bu cevap Wil Gieseler'in çözümünün bir uyarlamasıdır. Bu nedenle, orada kullanılan aynı post-build komut dosyasını gerektirir. Bunu cevaba açıkça ekledim.
ravron

2

Değiştirilmiş prosedürü denedim ve işe yaramadı, çünkü: -

  1. Xcode 4.2.1 .xcodeproj içindeki xcuserdata alt dizinini değiştirir

  2. git Project-Info.plist'deki önceki değişikliği not eder

Aşağıdaki değişiklik bunların göz ardı edilmesine neden olur ve yalnızca gerçek değişiklikleri işaretler: -

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

2

Bunu yalnızca arşivlerken (ve örneğin TF'ye yüklerken) yapmak isteyebilirsiniz . Aksi takdirde sürüm numaranız çok hızlı yükselebilir.

Şemada (Ürün / Düzenleme Düzeni / Arşiv / İşlem Öncesi) yalnızca arşivlediğinizde yürütülecek bir komut dosyası ekleyebilirsiniz.

Ayrıca, uygulama sürümünü her artırışınızda oluşturma numarasını sıfırlamak isteyebilirsiniz.

Son olarak, bunun yerine arşivi kullanırsanız, güvenle devre dışı bırakabilirsiniz:

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

Derleme numarası yalnızca arşivlendiğinde artacağından ...

DÜZENLEME: Söylediklerimi düzeltin, arşivdeki ön eylemler derlemeden sonra (ancak arşivlemeden önce) gerçekleşir, bu nedenle derleme numarası sonraki arşiv için artırılır ... Ancak yeni bir şema oluşturabilir ve bu eylemi derlemeye ekleyebilirsiniz ( eylemler) bölümüne bakın. yeni bir yapı oluşturmak istediğinizde bu şemayı kullanın


1
Evet hızla yükseliyor (şu anda 5500+), ama bu benim için sorun değil; bu sadece bir sayı. Bir şey olsa bile işe başlamadan önce Cmd-B / Cmd-R'ye kaç kez vurulduğu
ilginç

2

Yapı numarası için son SVN revizyonunu kullanıyorum. Derleme dizinindeki Info.plist öğesini değiştirirseniz, kaynak Info.plist dosyasını etkilemezsiniz:

# 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}'`

2

Kabilemi bulduğumu hissediyorum. Kabile, umarım VersionX tarafından eğlenmişsinizdir.

On yıl önce içinde 25'ten fazla Xcode projesi olan bir çalışma alanı üzerinde çalışırken, sürümü otomatikleştirip, zaman zaman güncellemeleri olan bir veya iki projeyi sürdürüyorsanız, saçma görünebilecek bir dereceye kadar dize güncellemeleri oluşturma fırsatını aldım.

VersionX:

  • yapı türünün farkındadır (Release / Debug)
  • depodan derleme sırasında bilgi toplar (git desteği dahil, ancak hg, svn veya kullandığınız her şey için özelleştirilebilir)
  • kolayca özelleştirilebilen süslü pazarlama sürüm dizeleri (App Store'dan önce bir kural koymadan önce çok daha fazla varyasyonu vardı) için sağlandığından, örneğin bir git etiketi kuralı kullanarak bir "beta" için semboller içeren dizeleri otomatik olarak artırabilirsiniz.
  • sürüm ve tamamlama bilgilerini içeren örnek değişkenlerle doldurulmuş bir sınıf içerir. Bu, panelinizi doldurmak ve önceden doldurulmuş bilgiler içeren günlük dizeleri, kilitlenme raporları veya kullanıcı e-posta hata raporları oluşturmak için kullanışlıdır.

Yapması eğlenceliydi. Xcode derleme sistemi hakkında bir kayık yükü öğrendim.

VersionX'in otomatik olarak oluşturabileceği süslü Version ve Build dizelerinin türüne bir örnek.

SürümX 1.0.1 β7 (c5959a3 “Temiz”)

Pazarlama Sürümü: VersionX 1.0.1 β7 "1.0.1, kesinleştirme etiketinden türetilirken," Beta 7 "otomatik olarak kesinleştirme sayısı veya oluşturma sayısı tarafından oluşturulur (örneğin).

Derleme Sürümü: (c5959a3 “Clean”) Kısa işleme karmasını görüntüler ve derleme dizininde sıfır taahhüt edilmemiş değişiklik olduğunu bildirir.

VersionX (GitHub'da kaynak) - Xcode projelerinde sürümü otomatik olarak artırmak ve dizeleri oluşturmak için barok bir sistem.

VersionX Belgeleri.



1

build numberAşağıdaki yöntemi kullanarak güncelleme .

$INFO_FILEplist dosyasının yoludur. Ve $build_numberbu bina için yeni bir yapı numarası.

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

Genellikle benim ve parçalardan $build_numberoluşur . Proje bilgilerinden gelmeniz. Bu yüzden parçanın nasıl oluşturulacağını açıklarım.majorminorminormajor

## 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}"

Karar vermek için 2 stratejim var $build_number.

İlk Strateji

Bu strateji kullanır git tagkarar vermek sayımı majorarasında build number. 53Projenin etiketleri varsa , 53kabuk komut dosyasını izleyerek geri döner .

Genellikle artıyor. Ve geliştiriciyi yayınlamadan önce bir git etiketi koymaya zorlar.

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

İkinci Strateji

Bırakın Jenkins CI sistemi karar versin major. Ortam değişkeni vardır BUILD_NUMBER. CI sistemi üzerine inşa edildiğinde otomatik olarak artmaktadır. Bu bilgiler, CI sistemindeki proje geçmişini izlemek için kullanışlıdır.

major_number=${BUILD_NUMBER}

1

Heres güncellenmiş bir versiyonudur. Bu, Xcode 9.3.1, iOS 11'den itibaren çalışır.

Uygulama hedefinizden 'Aşama Oluştur' düğmesini tıklayın, yeni bir çalışma komut dosyası eklemek için + simgesini tıklayın ve kutuya bu kodu yapıştırın.

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}"

Info.plist dosyasına gidin ve 'Paket sürümü' 1'e ve 'Paket sürümleri dizesi, kısa' 1 olarak ayarlayın, ayarlamanız gerekir.

Info.plist görünümünde projeyi derlediğinizde, Paket sürümü (Derleme numarası) değişikliğini görmelisiniz.

  • Xcode 9.3.1'den itibaren bu değişiklikleri genel sekmeden göremeyeceğinizi, ancak bir yapıyı arşivlediğinizde ve Info.plist'deki değişiklikleri göreceğinizi unutmayın.

0

İşte benim çözümüm. Eğer benim gibi: terminal dostu, ruby ​​gibi, anlamsal versiyonlama gibi, bunu deneyin.

Şunu Rakefileiçeren bir dosya oluşturun:

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
}

Hazırlamak: gem install xcodeproj versionomy

Çalıştır: rake increment:majorya rake increment:minorda rake increment:tinyne zaman istersen.


0

Agvtool Kullanarak Sürümü Otomatikleştir ve Sayıları Oluştur'u kullanmayı en rahat buluyorum .

Bunu dene:

  1. Apple'ın yukarıda bağlantılı belgelerinde açıklandığı şekilde yapılandırın.
  2. Projeye Ön Eylem Olarak Komut Dosyası Ekle -> Şemayı Düzenle ... -> Arşiv (veya isterseniz diğer)
  3. Küme: Derleme ayarlarını sağlayın <your_app_target>

Komut dosyası (ilk satır isteğe bağlıdır):

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

0

Bunu Apple'ın kendi tarzında yapalım. Her başarılı derlemeden sonra derleme sayısını artıracaktır

Size 5 resim boyunca rehberlik edeceğim, sadece içinden geçin.

  1. Stop_build_button öğesinin sağ tarafında bulunan Proje adınızı seçtiğinizde, açılır menüden 'Düzeni Düzenle ...' seçeneğini belirleyin. İlk Adımı Kontrol Et

  2. LeftSide menüsünden 'Build' seçeneğini genişletin ve 'Post-actions' seçeneğini seçin İkinci Adımı Kontrol Et

  3. Burada, programınızı başarıyla oluşturduktan sonra yürütmek istediğiniz kodları (Komut Dosyaları) ekleyebilirsiniz. Otomasyonumuzun mükemmel çalışması için az miktarda kod eklememiz gereken yerdir. >> 1. Yeni komut dosyası eklemek için soldaki köşeden 'ekle (+)' düğmesini seçin >> 2. Şimdi açılır menüden 'Yeni Çalıştır Script Eylemi' seçeneğini seçin Üçüncü Adımı Kontrol Edin

  4. 3 alanı vardır >> 1. kabuk sizin için zaten atanmış >> 2. şimdi 'Ayarları oluşturmanızı sağlayın' için Proje Adınızı seçin. >> 3. Senaryonuzu eklemek için büyük bir alan var, sadece bu kodu buraya kopyalayıp geçebilirsiniz : Dördüncü Adımı Kontrol Edin

    PLIST = "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}" PLB = / usr / libexec / PlistBuddy LAST_NUMBER = $ ($ PLB -c "CFBundleVersion Yazdır" "$ PLIST") NEW_VERSION = $ (($ LAST_NUMBER + 1) $ PLB -c "Ayarla: CFBundleVersion $ NEW_VERSION" "$ PLIST"

  5. 4. adımı tamamladıktan sonra sadece pencereyi kapatmak için 'Kapat'ı seçin ve son adımı yapmalıyız, Proje dosyası menüsünde' plist.info 'dosyanıza gidin ve' Anahtar 'Bölümü altındaki' Paket Sürümü 'anahtarının Adımda Sayısal Değer Denetimi Oluşturma

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.