2012-11-10 32 views
5

我用这个作为我的项目构建阶段:在构建时更新dSYM中的CFBundleShortVersionString?

export PLISTBUDDY="/usr/libexec/PlistBuddy" 

export INFO="${CODESIGNING_FOLDER_PATH}/Info.plist" 
export RXREVISION=`git describe --tags | perl -pi -E "s/[^-]+\-([^-]+).*/\1/"` 
export RXVERSION=`git describe --tags | perl -pi -E "s/([^-]+)\-[^-]+.*/\1/"` 
$PLISTBUDDY $INFO -c "add CFBundleVersion string $RXREVISION" 
$PLISTBUDDY $INFO -c "set :CFBundleVersion $RXREVISION" 
$PLISTBUDDY $INFO -c "add CFBundleShortVersionString string $RXVERSION" 
$PLISTBUDDY $INFO -c "set :CFBundleShortVersionString $RXVERSION" 

这完全适用于内置应用程序的Info.plist更新构建修订,它不会发生变异我的源代码树。

我已经尝试把我的更新版本脚本都放在末尾和链接阶段之前。无论哪种方式,它都能够影响对构建应用程序的更改,但是dSYM是从原始源代码树构建的。

构建的应用程序和构建的dSYM之间的版本号不匹配是个问题。 (HockeyApp在这里抛出一个错误。)

如果我更新源代码树中的Info.plist,我需要处理它的变化。这给我两个选项,我可以看到:

  1. 把Info.plist放在源代码管理下,并让脚本直接编辑它。但这意味着我需要在每次构建之后检查更改。
  2. 忽略Info.plist,并让脚本直接编辑它。但Info.plist中有很多其他的东西,我想在源代码管理下想要

如何在dSYM中自动更新版本,而无需处理源代码树中的Info.plist更改每个版本?

另外,切向:我如何看到dSYM中的版本?

+0

我可能失去了一些东西,但琐碎的解决方案,我想的是删除的dSYM目录,如果有什么问题吧。如果您使用调试符号构建,则无论如何都会重新生成。 – 2012-11-10 16:25:08

+0

除非让构建变更源树,否则删除dSYM并重建只会重新生成具有错误的CFBundleShortVersionString的dSYM。我希望构建不要操纵任何源代码。 (显然,我会做任何突变*我*需要做的,并检查它是否正常工作,而不是每个构建。) –

+0

构建阶段的执行顺序是什么?自定义阶段何时执行? – Felix

回答

1

dSYM软件包在根文件夹中也有一个类似值的info.plist。你也可以用类似的方式修改它。

另一种方法是在额外的.xcconfig文件中定义版本号,并在info.plist中包含版本号,参见here

然后,您也决定要哪种版本的或释放或测试版本,通过使用多个独立info.plist文件,并引用到不同.xcconfig文件生成设置和不包括一个用于测试构建源代码控制之下。

一般来说,我会建议为每个版本更改进行提交,因为这会使代码真正可重现,并且在源代码管理系统中也可以唯一标识它。

除此之外,Apple指定将CFBundleVersion设置为“单调增加的字符串,由一个或多个由句点分隔的整数组成”,请参阅hereCFBundleShortVersionString是您的营销版本,例如你的目标是在版本3.0上工作。

因此,如何做以下的发布版本:用新的版本号和CFBundleShortVersion与新营销的版本一样3.0 Beta 1更新CFBundleVersion并提交他们两个,然后是提交发布标签。版本号与其他任何元数据一样都是源代码的一部分,特别是如果版本号也用于触发特定代码以实现兼容性,数据库升级或其他事情(通常会这样做)。

+0

我实际上做的是从git标签中拉出版本。因此,该版本位于源代码管理中,它只是元数据的一部分,而不是主要数据。无论如何:我只是没有看到Info.plist中的按键。谢谢! –

4

接受的答案是正确的,但没有给出关于如何修改dsym的plist的实际细节。添加以下行构建脚本会修改DSYM plist中:

cd "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app.dSYM/Contents" 
$PLISTBUDDY -c "Set CFBundleVersion $RXREVISION" Info.plist 
+0

使用'“$ DWARF_DSYM_FOLDER_PATH/$ DWARF_DSYM_FILE_NAME/Contents/Info.plist”'可能更具前瞻性。 –

1

下面是“设置从混帐CFBundleVersion”的完整剧本构建阶段我使用:

APP_INFO_PLIST="${TARGET_BUILD_DIR}/${INFOPLIST_PATH}" 
DSYM_INFO_PLIST="${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist" 

BUILD_NUMBER=`git rev-list HEAD --count` 

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$APP_INFO_PLIST" 
if [ -f "$DSYM_INFO_PLIST" ] ; then 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$DSYM_INFO_PLIST" 
fi 

(注它必须在Xcode 6)

+0

在xcode 7中不适用于我。在“复制捆绑软件资源”之后运行。对存在的检查通过了,但是当试图通过xcode将应用程序部署到测试设备时仍然出现无法读取错误。我应该寻找的任何其他设置? – lostintranslation

+0

@lostintranslation似乎不太可能与此步骤或Xcode 7有任何关系。 –

0

我创建了一个脚本,我可以放到任何Xcode项目文件夹,并从运行脚本调用,将更新的应用程序Info.plist中和后“复制包资源”运行dSYM这样的构建号码匹配。然后它可以上传到像HockeyApp和iTunes Connect for TestFlight和App Store这样的服务。

我更喜欢在Xcode的运行脚本之外管理脚本,因为我可以更轻松地进行编辑并使项目文件的内容更小。我也可以独立于项目文件版本控制脚本。这个脚本中的Build Number只设置当前日期。还有其他方法可以生成唯一的内部版本号。 Jared Sinclair的博客介绍了一种方法,它使用Git hash作为最新的提交。我正在使用的脚本使用的时间戳记下降到一分钟。我发现知道何时创建构建并将构建编号加倍作为时间戳,我可以立即看到日期。而对于我的目的来说,它足够独特。

http://blog.jaredsinclair.com/post/97193356620/the-best-of-all-possible-xcode-automated-build

#!/bin/sh 
set -e 

# Purpose: Updates Info.plist for app and dSYM to a unique value for each build. 

# Usage: 
# Add as a Run Script in Xcode Build Phases 

# UPDATE_SCRIPT=${PROJECT_DIR}/update_build_number.sh 
# if [ -f ${UPDATE_SCRIPT} ]; then 
#  sh ${UPDATE_SCRIPT} 
# fi 

BUILD_NUMBER=`date "+%Y.%m.%d.%H%M"` 
APP_INFO_PLIST=${TARGET_BUILD_DIR}/${INFOPLIST_PATH} 
DSYM_INFO_PLIST=${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist 

if [ -f ${APP_INFO_PLIST} ]; then 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${APP_INFO_PLIST}" 
    echo "Updated ${APP_INFO_PLIST}" 
else 
    echo "Could not find ${APP_INFO_PLIST}" 
fi 

# Only the Release Configuration creates the dSYM 
if [ "${CONFIGURATION}" = 'Release' ]; then 
    if [ -f ${DSYM_INFO_PLIST} ]; then 
     /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${DSYM_INFO_PLIST}" 
     echo "Updated ${DSYM_INFO_PLIST}" 
    else 
     echo "Could not find ${DSYM_INFO_PLIST}" 
    fi 
fi 
相关问题