2011-03-14 18 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