2011-06-09 52 views
24

我試圖找出如何自動具有捆綁版本號增量在我的Xcode 4的項目(用於點對點和發佈版本)。我在網上發現了一些聲稱這樣做的腳本,但我不確定是將它們放在「預先操作」還是「後操作」中。我也不確定我應該在plist身上發揮什麼樣的價值;腳本將會改變的一個數字還是一個變量?如何在Xcode 4中自動增加Bundle版本?

,我曾試圖迄今似乎還沒有工作,所以任何幫助,將不勝感激的所有選項。

下面是最新的劇本,我嘗試使用:

conf=${CONFIGURATION} 
arch=${ARCHS:0:4} 
# Only increase the build number on Device and AdHoc/AppStore build 
if [ $conf != "Debug" ] && [ $conf != "Release" ] && [ $arch != "i386" ] 
then 
buildPlist=${INFOPLIST_FILE} 
buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBuildVersion" $buildPlist) 
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBuildNumber" $buildPlist) 
buildNumber=$(($buildNumber + 1)) 
/usr/libexec/PlistBuddy -c "Set :CFBuildNumber $buildNumber" $buildPlist 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildVersion.$buildNumber" $buildPlist 
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildVersion.$buildNumber" $buildPlist 
fi 
+0

的Xcode環境變量不是在Xcode4前/動作後可用(請參見http://openradar.appspot .com/9111439或http://openradar.appspot.com/9194286)。 所以你可以安裝最新版本的Xcode。 – Learner 2011-06-18 08:05:58

+0

對不起,沒有提到預執行/後執行不是構建系統的一部分。如果您想在每次啓動新構建過程時更新構建編號,請從Post-action運行腳本。您還可以查看以下步驟(充其量可能是解決方法) 1. cmd +, 2.選擇「行爲」選項卡 3.從左窗格中選擇「構建成功」項目 3.1。檢查右側窗格中的「運行」選項並選擇將增加內部版本號的腳本。 這次buildNumber會增加,如果你的構建成功。注意:首選項適用於您的所有Xcode項目。 – Learner 2011-06-18 08:25:48

回答

0

我發現,使用分層xcconfigs有助於這個問題。

複雜的工作建立與應用,庫和SDK,你必須能夠協調不只是建立每個項目的數字,但版本號的兼容性。

您可以構建管理標題,有效地與構建迭代次數(或版本信息,即測試版,開發REL)的文本文件,並通過每個項目的xcconfig進口環鏈導入。

在這一點上,你可以有一個目標構建腳本的步驟,將嵌入您的構建/版本信息。這也可以通過在plist中放置文本並在派生文件/構建文件節中運行PlistBuddy來完成。 (這樣你的源代碼控制的變化是最小的)

如果你能寫,做了必要的內部版本號擺弄構建執行腳本(或更好,但使用像竹子系統,爲您創建的文件),你可以保持與您的代碼分開。當然,如果你需要這樣做並保持跟蹤,你可能需要檢查修改的內部版本號以允許它增加。

我已經可以通過這種方式來維護內部版本號了: 2.0.3 b34(3473)我們在哪裏有內部版本號和SVN簽出構建點。 (請沒有git的欺侮,我的老同學)

前/後行動的尤伯杯通知或工藝都比較: 電子郵件的構建開始/失敗/等 複製完成項目的完成項目的服務器。

其他一切工作爲構建腳本更好。

(和往常一樣:使腳本階段調用外部腳本文件不推你的腳本到項目,它是在源控制項目文件地獄)

希望這有助於。

10

1,設置CFBundleVersion到1.0.1或類似的東西XXX

1

2,添加構建階段來運行shell腳本autoVersion。SH

2

3,保存以下指定autoVersion.sh

#!/bin/sh 
# Auto Increment Version Script 
# set CFBundleVersion to 1.0.1 first!!! 
# the perl regex splits out the last part of a build number (ie: 1.1.1) and increments it by one 
# if you have a build number that is more than 3 components, add a '\.\d+' into the first part of the regex. 
buildPlist=${INFOPLIST_FILE} 
newVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$buildPlist" | /usr/bin/perl -pe 's/(\d+\.\d+\.)(\d+)/$1.($2+1)/eg'` 
#echo $newVersion; 
/usr/libexec/PListBuddy -c "Set :CFBundleVersion $newVersion" "$buildPlist" 

4腳本,運行殼:CP autoVersion.sh〜/文檔/和chmod 777〜/文檔/ autoVersion.sh

5,Build &享受它。 :)

Perl代碼來自:https://gist.github.com/1436598

+2

非常實用! ,你實際上可以把它放到項目的根目錄下,並用shell/bin/sh作爲「$ SRCROOT/autoversion.sh」(帶引號)來調用,所以項目是可移植的 – PetrV 2013-07-23 09:45:03

1

任何人想要整合版本遞增到命令行構建腳本(也許是持續集成),請參閱下面的命令:

# cd into the project folder containing the plist 
    cd /Users/waitea/iOS/E.ON/iOS/trunk/Eon 

    # grab the version numbers 
    major_version=$(grep -C 2 CFBundleVersion App-Info.plist | grep -o '[0-9]\+.[0-9]\+.[0-9]\+') 
    major_version_min=$(echo $major_version | grep -o '[0-9]\+.[0-9]\+\.') 
    minor_version=$(echo $major_version | grep -o '[0-9]\+$') 

    # increment the minor version 
    increment=`expr $minor_version + 1` 
    incremented_whole_version="$major_version_min$increment" 

    # replace the build number in the plist using perl 
    /usr/bin/perl -p -i -e "s/$major_version/$incremented_whole_version/g" App-Info.plist 

這將增加xxx風格版本號中最右邊的數字。根據你的習慣調整reg-ex的值。

花了我一段時間,所以我想我會分享回饋給社區!

編輯 - 我創建了一個持續集成系統,它會爲你

https://github.com/adamwaite/XcodeProject

1

這可以幫助你做到這一點。我在我的項目中使用它。 https://gist.github.com/alokc83/5207294

#!/bin/sh 
# xcode-build-number-generator.sh 
# @desc Automaticvally create build number every time using curent day, month and year 
# @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" 


#Credits 
# [email protected] for intial direction about automatic versioning 
# http://www.codinghorror.com/blog/2007/02/whats-in-a-version-number-anyway.html (For unferstanding the Software Versoining) 
#Feel free to leave comment or report issues 


MONTH=`date | awk '{print $2}'` 

case "$MONTH" in 
    'Jan') 
     MONTHNUMBER=1 
    ;; 
    'Feb') 
     MONTHNUMBER=2 
    ;; 
    'Mar') 
    MONTHNUMBER=3 
    echo "Month is $MONTHNUMBER" 
    ;; 
    'Apr') 
     MONTHNUMBER=4 
    ;; 
    'May') 
     MONTHNUMBER=5 
     ;; 
    'Jun') 
     MONTHNUMBER=6 
     ;; 
    'Jul') 
     MONTHNUMBER=7 
     ;; 
    'Aug') 
     MONTHNUMBER=8 
     ;; 
    'Sep') 
     MONTHNUMBER=9 
     ;; 
    'Oct') 
     MONTHNUMBER=10 
     ;; 
    'Nov') 
     MONTHNUMBER=11 
     ;; 
    'Dec') 
     MONTHNUMBER=12 
     ;; 
esac 

DATE=`date | awk '{print $3}'` 
echo "Date = $DATE" 
YEAR=`date | awk '{print $6}'` 
echo "Date = $YEAR" 

### only uncomment section below if testing the format in terminal 
#echo "BuildNumber1 = $MONTH$DATE$YEAR" 
#echo "or BUILD NUMBER = $DATE$MONTH$YEAR" 
#echo "or BUILD NUMBER = $MONTHNUMBER$DATE$YEAR Format is |Month Number Date Year|" 
#echo "or BUILD NUMBER = $DATE$MONTHNUMBER$YEAR format is |Date MonthNumber Year|" 
############################ 

#### Uncomment only one one style or last one will be in effect 
#buildNumber=$MONTH$DATE$YEAR 
#buildNumber=$DATE$MONTH$YEAR 
buildNumber=$MONTHNUMBER$DATE$YEAR 
#buildNumber=$DATE$MONTHNUMBER$YEAR 


echo "Final Build number is $buildNumber" 
## Below command write buildNumber in the property list 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}" 
4

相同的思路阿利克斯的答案,但要簡單得多:

buildNumber=`/bin/date +%Y%m%d%H%M%S` 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}" 

Build Phases添加爲Run Script項目上的Target。這也具有monotonically increasing的優點。

0

FWIW - 這是我目前使用的增加版本號的版本版本(其中包括歸檔)。在Xcode 5.1下工作正常。

只需複製/直接在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; 
0

如果你使用一個版本的系統,如「X.X.X」你可以添加這個運行腳本。它會增加版本號(XXX + 1),每一個新的版本是由時間:

if [ "${CONFIGURATION}" != "Debug" ]; then 

VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}") 

NEWSUBVERSION=`echo $VERSIONNUM | awk -F "." '{print $4}'` 

NEWSUBVERSION=$(($NEWSUBVERSION + 1)) 

NEWVERSIONSTRING=`echo $VERSIONNUM | awk -F "." '{print $1 "." $2 "." $3 ".'$NEWSUBVERSION'" }'` 

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $NEWVERSIONSTRING" "${PROJECT_DIR}/${INFOPLIST_FILE}" 

fi 
相關問題