2011-06-09 59 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