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

问题描述 投票:24回答:9

我试图弄清楚如何在我的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
ios xcode build xcode4
9个回答
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,建立并享受它。 :)

perl代码来自:https://gist.github.com/1436598


10
投票

您可能会发现以下帖子有用:

通过Jeff LaMarche http://iphonedevelopment.blogspot.com/2011/07/auto-incrementing-build-numbers-for.html从iPhone开发中自动增加Xcode中版本构建的内部版本号


4
投票

与Alix的答案相同的想法,但更简单:

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

将此作为Run Script上的Build Phases项目添加到Target上。这也有monotonically increasing的优势。


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

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


0
投票

我发现使用分层xcconfigs有助于解决这个问题。

使用应用程序,库和SDK处理复杂的构建时,您必须能够协调每个项目的构建数量,而不是构建数量兼容性。

您可以创建一个构建管理标头,它实际上是一个带有构建迭代编号(或版本信息,即beta,dev,rel)的文本文件,并通过每个项目的xcconfig导入链导入它。

此时,您可以拥有一个目标构建脚本步骤,该步骤将嵌入您的构建/版本控制信息。这也可以通过在plist中放置文本并在派生文件/构建文件部分上运行PlistBuddy来实现。 (这样你的源代码控制变化很小)

如果你可以编写一个构建执行脚本来执行必要的构建编号(或者更好,使用像bamboo这样的系统为你创建文件),你可以将它与代码分开。当然,如果您需要这样做并跟踪,您可能必须检查更改的内部版本号以允许它增加。

我已经能够保持以下行的编号:2.0.3 b34(3473)我们有一个内部版本号和一个SVN结帐构建点。 (请不要git hazing,我老了)

优先通知或流程的前/后操作更多:构建启动/失败的电子邮件/ etc将完成的项目复制到完成的项目服务器。

其他一切作为构建脚本更好。

(和往常一样:让脚本阶段调用一个外部脚本文件。不要将你的脚本推送到项目中,它是控制项目文件的源头的地狱)

希望这可以帮助。


0
投票

FWIW - 这是我目前用于增加版本号(包括存档)的内部版本号。在Xcode 5.1下正常工作。

只需将代码段直接复制/粘贴到Xcode中的Run脚本构建阶段:

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”这样的版本系统,则可以添加此运行脚本。每次进行新构建时,它都会增加版本号(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

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"
© www.soinside.com 2019 - 2024. All rights reserved.