更好的方式增加内部版本号?
我一直在使用shell脚本作为我的Xcode构建过程的一部分,以增加plist文件内的构建编号,但是它使得Xcode 4.2.1经常崩溃(有关目标不属于某个项目的错误;我猜测plist文件的更改以某种方式混淆了Xcode)。
shell脚本完成了这个工作,只有当一个文件比plist文件更新时,构建编号才会被agvtool
递增(所以刚建立时不会增加值):
if [ -n "`find ProjDir -newer ProjDir/Project-Info.plist`" ]; then agvtool -noscm next-version -all; else echo "Version not incremented"; fi
有没有办法增加不破解Xcode的内部版本号(在plist文件或其他地方)?
编辑 :这是我的最终解决方案,基于@Monolo的建议。 我在${PROJECT_DIR}/tools
(与.xcodeproj
目录同级)中创建了以下脚本:
#!/bin/sh
if [ $# -ne 1 ]; then
echo usage: $0 plist-file
exit 1
fi
plist="$1"
dir="$(dirname "$plist")"
# Only increment the build number if source files have changed
if [ -n "$(find "$dir" ! -path "*xcuserdata*" ! -path "*.git" -newer "$plist")" ]; then
buildnum=$(/usr/libexec/Plistbuddy -c "Print CFBundleVersion" "$plist")
if [ -z "$buildnum" ]; then
echo "No build number in $plist"
exit 2
fi
buildnum=$(expr $buildnum + 1)
/usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "$plist"
echo "Incremented build number to $buildnum"
else
echo "Not incrementing build number as source files have not changed"
fi
编辑2 :我已经修改脚本以合并@Milliways建议。
然后我从Xcode目标'Build Phases'部分调用脚本:
编辑3 :根据@ massimobio的答案,如果包含空格,则需要在plist参数周围添加引号。
编辑4 :只是为了更新,我调用此构建脚本的首选方法现在是创建一个单独的目标,并使应用程序目标依赖于此Bump Build Number目标。 这可以确保在应用目标对plist执行任何操作之前调用它(我注意到它喜欢在构建开始时处理plist)。 我也转而采用纯粹的基于python的解决方案,将版本号保存在单独的文件中,并编写版本源文件,因为这对于跨平台产品更为有用(即Windows下的Visual Studio可以调用脚本,并且显然cmake / make-type build也可以这样做)。 这样做的好处是,即使在不同的平台下,内部版本号也始终相同,并且还可以使用当前版本/内部版本更新Visual Studio Resource.rc
文件。
这里是我目前用来更新Xcode项目中的Info.plist
文件的python脚本。
如果我正确理解你的问题,你想修改Project-Info.plist
文件,它是Xcode标准项目模板的一部分?
我问这个问题的原因是Project-Info.plist
通常处于版本控制之下,修改它意味着它将被标记为已修改。
如果你没有问题,那么下面的代码片段将更新内部版本号,并将文件标记为在进程中被修改,其中get_build_number
是一些脚本,用于获取要使用的(可能增加的)内部版本号:
#!/bin/sh
# get_build_number is a placeholder for your script to get the latest build number
build_number = `get_build_number`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${build_number}" ProjDir/Project-Info.plist
PlistBuddy允许您在plist文件中设置任何键,而不仅仅是版本号。 您可以创建所需的所有plist文件,并根据需要将其包含在资源中。 然后他们可以从包中读入。
至于您需要在关于窗格和其他位置显示版本,您还可以查看设置CFBundleGetInfoString
和CFBundleShortVersionString
。
我在这个问题上弄了很多答案,他们中没有一个让我满意。 然而,我终于想出了一个我非常喜欢的混合物!
有两个步骤,一个在开始阶段,一个在构建阶段结束。
在开始时:
# Set the build number to the count of Git commits
buildNumber=$(git rev-list HEAD | wc -l | tr -d ' ')
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
最后:
# Set the build number to "DEVELOPMENT"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"
看看Xcode中的Info.plist,你会看到版本号是“DEVELOPMENT”,但是构建的应用程序将会有一个不断增加的内部版本号。 (只要你总是在同一个分支上进行构建)。
在最后将版本号设置回一个常量字符串可防止Info.plist文件被构建应用程序所改变。
为什么我喜欢这种方法:
我已经使用了这个glist它的真棒,并按预期工作。 https://gist.github.com/sekati/3172554(所有功劳归于原作者)
我修改了一段时间的评论。
xcode-versionString-generator.sh,
xcode-build-number-generator.sh
正如这些要点正在帮助开发社区一样。 我想让github项目脱离它。 所以让我们开发好。 这是github项目:https://github.com/alokc83/Xcode-build-and-version-generator
我已经更新了两个脚本的一些增强代码。 而不是使用下面的从github获取最新的
对于版本:
# xcode-version-bump.sh
# @desc Auto-increment the version number (only) when a project is archived for export.
# @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. Check the checkbox "Run script only when installing"
# 6. Drag the "Run Script" below "Link Binaries With Libraries"
# 7. Insure your starting version number is in SemVer format (e.g. 1.0.0)
# This splits a two-decimal version string, such as "0.45.123", allowing us to increment the third position.
VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
NEWSUBVERSION=`echo $VERSIONNUM | awk -F "." '{print $3}'`
NEWSUBVERSION=$(($NEWSUBVERSION + 1))
NEWVERSIONSTRING=`echo $VERSIONNUM | awk -F "." '{print $1 "." $2 ".'$NEWSUBVERSION'" }'`
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $NEWVERSIONSTRING" "${PROJECT_DIR}/${INFOPLIST_FILE}"
构建:
# xcode-build-bump.sh
# @desc Auto-increment the build number every time the project is run.
# @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"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
链接地址: http://www.djcxy.com/p/58247.html