我想将当前的Subversion修订版号(如报告所示svnversion
)插入到我的Xcode项目中.我设法插入的版本号进入Info.plist
的$PROJECT_DIR
,但是这不是一个好的解决方案,因为该文件版本.我试图将修订版插入到Info.plist
build目录中,但是在代码签名阶段我遇到了一个错误(这是一个iPhone应用程序).
是否有一种简单的方法可以使用某些构建文件将修订号输入应用程序,以便更改版本不会更改版本化文件?我想也许我可以创建一个临时源文件,该文件将与其他文件链接并提供获取修订号的功能.但我不知道该怎么做.
我对其他解决方案不太感兴趣,即.这个agvtool
.我想要的只是应用程序可用的修订版号,没有太大的魔力.
有一个更简单的解决方案:使用Leopard中包含的PlistBuddy/usr/libexec/PlistBuddy
.有关详细信息,请参阅我对相关SO问题的回答.
PlistBuddy可以在Xcode中的Run Script构建阶段使用,并且可以仅用于影响已处理的plist文件.只需将它放在复制资源阶段之后,您甚至不必每次都清理目标以使其运行.您甚至不必将值打印到头文件中,并使SVN忽略它.
echo -n ${TARGET_BUILD_DIR}/${INFOPLIST_PATH} \ | xargs -0 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion `svnversion -n`"
假设您在代码签名发生之前添加构建阶段,则应使用替换值对plist进行签名.
对于后代,我通过在我的项目中添加revision.h,然后将以下内容添加为Run Script构建阶段,为iPhone应用程序做了类似于zoul的操作:
REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` echo "#define kRevisionNumber @\"$REV\"" > ${PROJECT_DIR}/revision.h
我这样做是为了获取一个简单的修订号,而不是svnversion在zoul的解决方案中产生的更详细的字符串.
对于Mac应用程序,我将此方法基于此帖子,而是创建了buildnumber.xcconfig文件.在目标的构建设置下,我将对话框右下角的"基于"值更改为buildnumber.xcconfig.在Info.plist中,我编辑了以下几行:
CFBundleVersion ${BUILD_NUMBER} CFBundleShortVersionString Version 1.0
这样我的About对话框将显示类似于Version 1.0(1234)的版本字符串,其中1234是Subversion版本号.最后,我使用以下代码创建了一个Run Script构建阶段:
REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig
这可能不是最干净的方式,因为它需要一个干净的循环才能构建新版本以在应用程序中保留,但它可以工作.
作为Stack Overflow的新用户,我无法对Quinn的帖子发表评论,但是如果你使用的是一次有多个项目的SVN存储库,我只需要做一些小改动就可以使他的解决方案更加准确.
使用他的方法,返回的svnversion号是整个存储库的最后一个签入,不一定是您的代码库.此调整允许更新特定于您的代码库.
REV=`svnversion -nc | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $REV" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
使用-c标志将以下列形式收集代码库的活动分支/标记/主干中的最后一次提交,然后将您不想存储的位作为修订号.
另外,请注意$ {TARGET_BUILD_DIR}周围的双引号.对于决定将项目放在名称中带有空格的目录结构中的用户来说,这些是必需的.
希望这有助于他人!
I found this page when trying to do a similar thing for my iPhone app and thought it might be helpful to share the code I decided on. I was trying to have a base version number set in my Target Info (for example 0.9.5) but then append my SVN revision number at the end of it. I needed this stored in CFBundleVersion so that AdHoc users would be able to update via iTunes even if I didn't remember to rev the version number in my Target Info pane. That's why I couldn't use the "revision.h" method which otherwise worked beautifully. Here's the final code I settled on which I've placed as a Run Script phase just after the "Copy Bundle Resources" build phase:
BASEVERNUM=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${INFOPLIST_FILE}" | sed 's/,/, /g'` REV=`svnversion -n` SVNDATE=`LC_ALL=C svn info | awk '/^Last Changed Date:/ {print $4,$5}'` /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BASEVERNUM.$REV" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH} /usr/libexec/PlistBuddy -c "Set :BuildDateString $SVNDATE" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
It should append the results of svnversion to the end of whatever is set in the base Info.plist as the version. This way you can have something like 0.9.5 in your info plist and still have the .189 revision number appended at the end, giving a final version number of 0.9.5.189
Hope this helps someone else!