我试图弄清楚如何在我的Xcode 4项目中自动增加Bundle版本号(对于ad-hoc和发布版本)。我在网上发现了一些旨在做到这一点的脚本,但我不确定是否将它们放在“预操作”或“后动作”中。我也不确定我应该在plist中放置什么价值;一个数字,然后脚本将更改或变量?
到目前为止我尝试的所有选项似乎都没有用,所以任何帮助都会受到高度赞赏。
以下是我尝试使用的最新脚本:
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 :(得分:11)
1,将CFBundleVersion设置为1.0.1或类似x.x.x
2,添加构建阶段以运行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代码答案 1 :(得分:10)
您可能会发现以下帖子有用:
从iPhone开发中自动增加Xcode中版本构建的内部版本号 作者:Jeff LaMarche http://iphonedevelopment.blogspot.com/2011/07/auto-incrementing-build-numbers-for.html
答案 2 :(得分:4)
与Alix的回答相同,但更为简单:
buildNumber=`/bin/date +%Y%m%d%H%M%S`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
在Run Script
的{{1}}上将其添加为Build Phases
项。这也有monotonically increasing的优点。
答案 3 :(得分: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
这将增加x.x.x样式版本号中最右边的数字。调整注册表以改变你的约定。
我花了一段时间,所以我想我会分享回馈给社区!
编辑 - 我创建了一个可以为您执行此操作的持续集成系统
答案 4 :(得分: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
# 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}"
答案 5 :(得分:0)
我发现使用分层xcconfigs有助于解决这个问题。
使用应用程序,库和SDK处理复杂的构建时,您必须能够协调每个项目的构建数量,而不是构建数字兼容性。
您可以创建一个构建管理标头,它实际上是一个带有构建迭代编号(或版本信息,例如beta,dev,rel)的文本文件,并通过每个项目的xcconfig导入链导入它。
此时,您可以拥有一个目标构建脚本步骤,该步骤将嵌入您的构建/版本控制信息。这也可以通过在plist中放置文本并在派生文件/构建文件部分上运行PlistBuddy来实现。 (这样您的源代码控制更改很少)
如果您可以编写一个构建执行脚本来执行必要的构建编号(或者更好,使用类似Bamboo的系统为您创建文件),您可以将它与代码分开。当然,如果你需要这样做并跟踪,你可能需要检查更改后的内部版本号以允许它增加。
由于这个原因,我能够保持以下行的编号: 2.0.3 b34(3473)我们有一个内部版本号和一个SVN结帐构建点。 (请不要git hazing,我老了)
优步通知或流程的前/后操作更多: 通过电子邮件发送构建开始/失败/等 将完成的项目复制到完成的项目服务器。
其他所有内容都更适合作为构建脚本。
(和往常一样:让脚本阶段调用一个外部脚本文件。不要将你的脚本推送到项目中,这是控制项目文件的源头)
希望这有帮助。
答案 6 :(得分: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;
答案 7 :(得分:0)
如果您使用的是像“x.x.x”这样的版本系统,则可以添加此运行脚本。每次进行新构建时,它都会增加版本号(x.x.x + 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
答案 8 :(得分:0)
我还没有找到Xcode 10.1的绝佳解决方案。我已经修改了一些脚本以实现目标。现在一切正常。
version=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${INFOPLIST_FILE}")
build=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${INFOPLIST_FILE}")
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:1:DefaultValue ${version}" "${CODESIGNING_FOLDER_PATH}/Settings.bundle/Root.plist"