如何在Xcode 4中自动增加Bundle版本?
我想弄清楚如何在我的Xcode 4项目(特设和发布版本)中自动添加Bundle版本号增量。 我在网上发现了一些旨在做到这一点的脚本,但我不确定是将它们放在“预先操作”还是“后续操作”中。 我也不确定我应该把这个价值放在哪里。 脚本将会改变的一个数字还是一个variables?
到目前为止我所尝试的所有选项似乎都不起作用,所以任何帮助将不胜感激。
以下是我正在尝试使用的最新脚本:
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
您可能会发现以下文章有帮助:
自动递增内部版本编译Xcode从iPhone开发由Jeff LaMarche http://iphonedevelopment.blogspot.com/2011/07/auto-incrementing-build-numbers-for.html
1,设置CFBundleVersion为1.0.1或类似的xxx
2,添加构build阶段来运行shell脚本autoVersion.sh
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,运行shell:cp autoVersion.sh〜/ Documents /和chmod 777〜/ Documents / autoVersion.sh
5,build设和享受它。 🙂
perl代码来自: https : //gist.github.com/1436598
和Alix的答案一样,但是要简单得多:
buildNumber=`/bin/date +%Y%m%d%H%M%S` /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
将此作为Run Script
Target
上的Build Phases
上的Run Script
项目添加。 这具有单调增加的优点。
这可能会帮助你。 我在我的项目中使用它。 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 # sekati@github 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}"
对于任何想要将版本增量集成到命令行构build脚本(可能用于持续集成)的用户,请参阅以下命令:
# 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来改变你的惯例。
花了我一段时间,所以我想我会分享回馈给社区!
编辑 – 我创build了一个持续集成系统,将为您做到这一点
我发现使用分层的xcconfigs有助于解决这个问题。
通过应用程序,库和SDK来处理复杂的构build,您必须能够协调,而不仅仅是为每个项目构build数字,而是构build数字兼容性。
您可以创build一个构buildpipe理头文件,这个头文件实际上是一个带有构build迭代编号(或版本信息,即beta,dev,rel)的文本文件,并通过每个项目的xcconfig导入链导入它。
在这一点上,你可以有一个目标构build脚本步骤,将embedded您的构build/版本信息。 这也可以通过在你的plist中放置文本并在派生文件/构build文件部分运行PlistBuddy来完成。 (这样你的源代码pipe理变化是最小的)
如果你可以写一个构build执行脚本来完成必要的内部版本号(或者更好,使用一个类似竹子的系统来为你创build文件),你可以将它与代码分开。 当然,如果你需要这样做,并保持跟踪,你可能需要检查更改的内部版本号,以允许它增加。
我已经能够维护这个版本号了:2.0.3 b34(3473)我们有一个内部版本号和一个SVN checkout构build点。 (请不要混淆,我是老派)
Uber通知或进程的前/后操作更多:生成开始/失败/等的电子邮件将完成的项目复制到完成的项目服务器。
其他一切作为一个生成脚本更好。
(和往常一样:让脚本阶段调用一个外部脚本文件,不要将你的脚本推入项目,它是控制项目文件的源代码)
希望这可以帮助。
FWIW – 这正是我目前用来增加内部版本 (包括归档)的版本号。 在Xcode 5.1下工作正常。
只需将片段直接复制/粘贴到Xcode中的运行脚本构build阶段即可:
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;
如果您使用的是“xxx”之类的版本系统,则可以添加此运行脚本。 每次构build新版本时,都会增加版本号(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