2011-03-14 73 views
9

为了实现持续集成系统Hudson,我编写了一个bash脚本来自动构建Xcode项目。 此外,在调试配置中,有人问我是否将项目的svn修订版号插入PROJECT-Info.plist文件的CFBundleRevision字段中,作为$ {BUNDLE_VERSION} .r $ {SVN_REVISION}。Bash脚本编辑PROJECT-Info.plist文件的CFBundleVersion字段

你会发现下面PROJECT-Info.plist文件的源代码:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
[...] 
    <key>CFBundleVersion</key> 
    <string>1.0</string> 
[...] 
</dict> 
</plist> 

我试过低于这个bash脚本:

sed 'N;s_^.*<key>CFBundleVersion</key>.*<string>[0-9][0-9]*\.[0-9][0-9]*</string>$_<key>CFBundleVersion</key>\ 
<string>'"$BUNDLE_VERSION"'\.r'"$SVN_REVISION"'</string>_' $PROJECT-Info.plist 

该脚本应取代 “1.0” 字符串与$ {BUNDLE_VERSION} .r $ {SVN_REVISION}(目前只在标准输出中)。 但是,替换工作时没有'N'选项,它包含sed进程中的下一行和一次一行。但是在PROJECT-Info.plist文件中有很多“<string>[...]</string>”字符串...

我认为这是我在两行之间处理未知字符的方式('N'选项和“。*”任何字符)都是错误的。

有什么想法?

提前致谢,对不起我的英语水平不好。

+0

您需要使用适当的XML工具,例如为操纵XML文件中的键和值而设计的Python或Perl模块。还有可用的shell实用程序,如xmlstarlet。 [正则表达式不符合挑战](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。顺便说一下,你的英语非常接近完美。 – 2011-03-14 15:31:58

+0

感谢您使用[xmlstarlet](http://xmlstar.sourceforge.net/)shell实用程序解决方案。我下载并安装了它。我明天会测试它,我会给你我的反馈。 – 2011-03-14 17:58:43

回答

0
$ myversion=1.0.3 
$ perl -O777 -i.bak -pe 's|<key>CFBundleVersion</key>\\s*<string>[\d.]*</string>|<key>CFBundleVersion</key></key>'"$myversion"'<string>|' bundle 

文件bundle移动到bundle.bak,并在新的bundle文件替换1.0.6.91.0.3

+0

明天我再回去工作时,我会先试试这个解决方案。 谢谢:) – 2011-03-14 19:49:15

+0

我很好奇,我立即尝试,它效果很好! 我只是修改这个命令行如下,因为我在我的脚本中先前备份了.plist文件,并在最后恢复它。 '的perl -0777 -pe “S | CFBundleVersion \ S * [\ d] * | CFBundleVersion $ BUNDLE_VERSION.r $修订 |” PROJECT-Info.plist.bak> PROJECT-Info.plist' 谢谢你们俩。 – 2011-03-14 20:51:34

+0

运行此代码的位置 – Warewolf 2013-06-19 13:20:08

24

使用PlistBuddy:

# cf. http://davedelong.com/blog/2009/04/15/incrementing-build-numbers-xcode 
/usr/libexec/PlistBuddy -h 
/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" test.plist 
myversion=1.0.5 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion '${myversion}'" test.plist 
+0

+1。显然是要走的路。 – bobbogo 2011-03-15 11:46:52

+0

谢谢。这是做到这一点的正确方法。另一个答案是非常不必要的破解。 – chown 2012-03-11 03:29:58

6

在这种特殊情况下也可以使用Xcode的agvtool。您甚至不需要提供PROJECT-Info.plist文件的路径。在您的项目目录中运行:

agvtool new-version -all "$BUILD_NUMBER" # sets CFBundleVersion 
agvtool new-marketing-version "$BUNDLE_VERSION" # sets CFBundleShortVersionString 
+0

维基链接已经死了。 – 2016-03-01 10:35:35

+0

适合我!谢谢!在项目文件夹中应该使用agvtool。 – Marslo 2017-07-31 13:06:55