【发布时间】:2011-11-14 08:11:07
【问题描述】:
什么是内部版本号,它的用途是什么? 和版本号一样吗?
【问题讨论】:
-
基于@cdashers 代码,我向 github 添加了一个简单的脚本供大家使用。 github.com/rbosch/Xcode-BuildNumber
什么是内部版本号,它的用途是什么? 和版本号一样吗?
【问题讨论】:
CFBundleVersion(捆绑版本) - 又名 Marketing version,将显示在您在 Appstore 上的产品页面上。
CFBundleShortVersionString(Bundle 版本字符串,短)- 捆绑包号,通常用作仅 TestFlight 用户可以看到的次要版本
以下是您如何以编程方式在Swift (4+) 中获取它们:
let buildNumber = Bundle.main.infoDictionary?[kCFBundleVersionKey as String] as? String,
let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
我曾经在我的 shell 脚本中需要营销版本,这就是我使用 xcode build tools 获得它的方法:
xcodebuild -showBuildSettings -project ${SDK_PROJECT} | sed '1d;s/^ *//;s/"/\\"/g;s/ = \(.*\)/="\1"/;s/ = /=/;s/UID.*//' > xcodebuild-env.tmp
source xcodebuild-env.tmp
echo "${MARKETING_VERSION}"
【讨论】:
这在 Xcode 6 中有效,并且仅在归档时修改 dSYM 信息字典:
if [ "${CONFIGURATION}" = "Release" ]; then
buildPlist="${SOURCE_ROOT}/${PROJECT_NAME}/${PROJECT_NAME}-Info.plist"
PlistBuddy="/usr/libexec/PlistBuddy"
CFBundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}")
CFBundleVersion=$(($CFBundleVersion + 1))
$PlistBuddy -c "Set :CFBundleVersion $CFBundleVersion" "$buildPlist"
$PlistBuddy -c "Set :CFBundleVersion $CFBundleVersion" "$INFOPLIST_FILE"
$PlistBuddy -c "Set :CFBundleVersion $CFBundleVersion" "${DWARF_DSYM_FOLDER_PATH}/${WRAPPER_NAME}.dSYM/Contents/Info.plist"
fi
【讨论】:
Info.plist文件。然后使正常的 Xcode 项目目标依赖于这个新的脚本目标。这将避免您试图避免的问题。这早在 Xcode 4.2 就被使用过,如果你使用 Build Phase 脚本弄乱了Info.plist,它会崩溃。 Related.
这在 Xcode 6 中适用于我:
cd ${SOURCE_ROOT}
buildPlist=${SOURCE_ROOT}/${PROJECT_NAME}/${PROJECT_NAME}-Info.plist
PlistBuddy="/usr/libexec/PlistBuddy"
buildNumber=`git rev-list HEAD --count`
buildNumber=$(($buildNumber + 1))
$PlistBuddy -c "Set :CFBundleVersion $buildNumber" $buildPlist
【讨论】:
buildPlist=${INFOPLIST_FILE} 替换第二行
内部版本号是指示应用当前状态的内部编号。它与版本号的不同之处在于它通常不是面向用户的,并且不像版本号通常那样表示任何差异/功能/升级。
这样想:
为了在您的项目中有效地使用它,Apple 提供了一个很棒的工具,称为 agvtool。它允许您轻松设置内部版本号和营销版本。它在编写脚本时特别有用(例如,轻松更新每个构建的构建号,甚至查询当前的构建号是什么)。它甚至可以做更多奇特的事情,比如在你更新内部版本号时为你标记你的 SVN。
使用它:
请参阅the man page of agvtool 了解大量信息
【讨论】:
avgtool new-version 这样做的一件事是,如果您希望 agvtool 设置 CFBundleVersion(摘要选项卡中的“构建”或Info 选项卡)并且您希望它设置 CURRENT_PROJECT_VERSION,它们都必须被定义为某些东西。否则,agvtool 不会设置它们。
我正在使用 Xcode 4.3.3 (4E3002) 并设法通过以下步骤使每个构建版本号 (CFBundleVersion) 自动增加:
输入以下代码:
buildPlist=$SRCROOT/$INFOPLIST_FILE
PlistBuddy="/usr/libexec/PlistBuddy"
CFBundleVersion=`$PlistBuddy -c "Print CFBundleVersion" $buildPlist`
CFBundleVersion=$(($CFBundleVersion + 1))
$PlistBuddy -c "Set :CFBundleVersion $CFBundleVersion" $buildPlist
玩得开心!
【讨论】:
如果您想为 CFBuildDate 使用 DATE 字段,请使用:
# get UTC date
CFBuildDate=$(date -u +"%a %b %d %T GMT %Y")
顺便说一句,来自 cdasher 的好建议
【讨论】:
许多人使用内部版本号来跟踪项目“构建”的总次数(仅针对小型项目进行编译,对于大型项目可能需要一些更复杂的过程)。
内部版本号是一个绝对值,每次构建都会递增。另一方面,版本号是任意“标签”或“标记”,用作特定内部版本号的简写。
假设您已经构建了 123 次项目,您的内部版本号是“123”,但为了简单起见,您可能决定将其称为“版本 1.0”。如果您再构建 20 次来修复错误,那么您的内部版本号是 143,但您的版本是“1.01”或“1.1”或任何您决定命名的版本。
我还看到了将构建号基于源代码控制的项目。因此,CVS/SVN 团队可能会使用修订号作为他们的内部版本号。我还看到使用最新提交的 SHA 作为内部版本号的 git 项目(尽管一些管理工具假设内部版本号是一个增量值 - 显然在 SHA 的情况下,它不是)。
【讨论】:
CFBundleVersion 设置为当前SVN 版本的构建阶段脚本吗?
此外,如果您将 CFBuildDate 作为字符串添加,并将 CFBuildNumber 作为字符串添加到 info.plist 中,则以下 shell 脚本(添加到运行脚本构建阶段 /bin/bash 时将自动更新您的构建号和日期:
# Auto Increment Version Script
buildPlist=${INFOPLIST_FILE}
CFBuildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBuildNumber" $buildPlist)
CFBuildNumber=$(($CFBuildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBuildNumber $CFBuildNumber" $buildPlist
CFBuildDate=$(date +%Y%m%d%H%M%S)
/usr/libexec/PlistBuddy -c "Set :CFBuildDate $CFBuildDate" $buildPlist
【讨论】:
CFBuildNumber 更改为 CFBundleVersion ,因此它的编号将显示在 Targets Summary 编辑器的 Build 字段中。
buildNum=`git log --oneline | wc -l` 以从 git 中提取构建标识符
git rev-list HEAD --count
内部版本号用于较小的更新(通常在开始时获得相当高的 1,并且可以在 1000 结束),例如:如果您更改了几行代码但没有更改逻辑或在更新中添加新功能。版本号用于相当大的更新,例如:您的应用程序中的新功能。然后你可以把它从 1.8 改成 2.0。
【讨论】: