更好的方式增加内部版本号?

我一直在使用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'部分调用脚本: Xcode构建阶段截图

编辑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文件,并根据需要将其包含在资源中。 然后他们可以从包中读入。

至于您需要在关于窗格和其他位置显示版本,您还可以查看设置CFBundleGetInfoStringCFBundleShortVersionString


我在这个问题上弄了很多答案,他们中没有一个让我满意。 然而,我终于想出了一个我非常喜欢的混合物!

有两个步骤,一个在开始阶段,一个在构建阶段结束。

在开始时:

# 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文件被构建应用程序所改变。

为什么我喜欢这种方法:

  • 简单
  • 不污染Git版本历史
  • CFBundleVersion是完全自动的
  • 漂亮的版本号可以随时修改

  • 我已经使用了这个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

    上一篇: Better way of incrementing build number?

    下一篇: Full 8 bit adder, illogical output