如何在Xcode 4中自动增加Bundle版本?

时间:2011-06-09 00:46:31

标签: ios xcode build xcode4

我试图弄清楚如何在我的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

9 个答案:

答案 0 :(得分:11)

1,将CFBundleVersion设置为1.0.1或类似x.x.x

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,运行shell:cp autoVersion.sh~ / Documents /和chmod 777~ / Documents / autoVersion.sh

5,Build&好好享受。 :)

来自https://gist.github.com/1436598

的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样式版本号中最右边的数字。调整注册表以改变你的约定。

我花了一段时间,所以我想我会分享回馈给社区!

编辑 - 我创建了一个可以为您执行此操作的持续集成系统

https://github.com/adamwaite/XcodeProject

答案 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"