当前位置:  开发笔记 > 数据库 > 正文

在Xcode中插入Subversion版本号

如何解决《在Xcode中插入Subversion版本号》经验,为你挑选了4个好方法。

我想将当前的Subversion修订版号(如报告所示svnversion)插入到我的Xcode项目中.我设法插入的版本号进入Info.plist$PROJECT_DIR,但是这不是一个好的解决方案,因为该文件版本.我试图将修订版插入到Info.plistbuild目录中,但是在代码签名阶段我遇到了一个错误(这是一个iPhone应用程序).

是否有一种简单的方法可以使用某些构建文件将修订号输入应用程序,以便更改版本不会更改版本化文件?我想也许我可以创建一个临时源文件,该文件将与其他文件链接并提供获取修订号的功能.但我不知道该怎么做.

我对其他解决方案不太感兴趣,即.这个agvtool.我想要的只是应用程序可用的修订版号,没有太大的魔力.



1> Quinn Taylor..:

有一个更简单的解决方案:使用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进行签名.


您可以使用"$ {TARGET_BUILD_DIR}/$ {INFOPLIST_PATH}"(包括双引号)替换硬编码的/path/to/Info.plist,以便您可以在其他项目中重用该脚本.
太好了!这与我提出的解决方案非常接近.这种方法的唯一问题是代码签名仅发生在每个其他构建中.那是因为Xcode似乎在**做任何事情之前检查依赖关系**.它假定项目中没有任何变化(不知道shell脚本),因此不需要代码签名并尽早决定删除它.这就是为什么我添加代码将结果文件的修改时间设置为1970.这使得Xcode看到某些东西已经过时并且必须进行代码签名.
我打破了svnversion说'svn:E200030:sqlite:回调请求查询中止'当我升级到Xcode 5.修复了`svn cleanup`.

2> Brad Larson..:

对于后代,我通过在我的项目中添加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

这可能不是最干净的方式,因为它需要一个干净的循环才能构建新版本以在应用程序中保留,但它可以工作.



3> George Walte..:

作为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}周围的双引号.对于决定将项目放在名称中带有空格的目录结构中的用户来说,这些是必需的.

希望这有助于他人!



4> Brian Robbin..:

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!

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有