在 bloglovin ,咱們使用自動生成版本號來設置Xcode,使當前的版本號爲在Git活躍的分支上git
的提交數。它一直正常工做着,但咱們的技術也不是一路順風的。github
糟糕的老方法xcode
咱們使用的技術是來自一個叫 「Cocoa is my Girlfriend」1 的網友發表的一篇文章,真是個不可緩存
原諒的名字。它工做原理以下:app
1. 運行一個腳本拿到Git提交數並把它輸出到一個 「infoplistwhatever.h」 文件中.這個文件名稱less
是什麼並不重要。工具
2. 在Xcode中選擇 Target 中的 build Setting,在Packaging 設置支持 「Preprocess Info.plistpost
File」 ,並設置 「Info.plist Preprocessor Prefix File」 的值爲Step1:中的文件名。ui
3. 在Setp1中的 "infoplistwhatever.h「 文件獲得的git提交數的值或者能達到這效果的其餘值,spa
讓它做爲預處理變量 custom_build_number 的值。
4. 在Xcode 的 Info.plist 中使用 custom_build_number 替換如今的版本號。
雖然這種技術能夠正常工做,但它有幾個很是使人討厭的缺點:
1. 每次提交改變數目後的生成都會弄髒Git。
2. 若是你不想弄髒Git,你必須忽略 「Preprocess Info.plist File」 。
3. 若是你忽略了預處理器的plist文件,你必須手動建立的一個初始化文件,不然在
Xcode上第一次生成將會失敗(除非你不把你的 」.gitignore「 文件提交到Git 倉庫上,
讓原始值繼續跟蹤文件如今的狀態)。
4. 版本號將不會更新,除非您手動清理和重建。這是由於在Xcode 用一種不可能被其
它機制清理的方式緩存了 Info.plist 。在這周圍我也嘗試了不少:生成預動做方案,
其餘的運行腳本等。也沒有想到其它的方式,只有手動清理和從新生成,同時也失去了
自動設置的目的。
最可行的方法
通過大量的谷歌搜索,我搜到一篇文章的匿名評論,並且評論中提到的技術表現更好些。它
避免了咱們以前的技術全部的缺陷,並且更容易設置。你須要作的就是支持該技術,在
」build phase「 的 「Copy Bundle Resources」 後面添一個 "run script" 腳本。
腳本代碼:
# # Set the build number to the current git commit count. # If we're using the Dev scheme, then we'll suffix the build # number with the current branch name, to make collisions # far less likely across feature branches. # Based on: http://w3facility.info/question/how-do-i-force-xcode-to-rebuild-the-info-plist-file-in-my-project-every-time-i-build-the-project/ # git=`sh /etc/profile; which git` appBuild=`"$git" rev-list --all |wc -l` if [ $CONFIGURATION = "Debug" ]; then branchName=`"$git" rev-parse --abbrev-ref HEAD` /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $appBuild-$branchName" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}" else /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $appBuild" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}" fi echo "Updated ${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
這個腳本使用 PlistBuddy 命令行工具來編輯 /foo/DerivedData/bar(也是Target的生成目錄)
目錄下的 Info.plist 的版本號。這就是爲何版本號變化時Git不會被弄髒。每次生成它都會更
新了版本號,不僅是一個總的清理後的第一次生成,並且和你是否在 Info.plist 頁面也沒有關係。
上面的代碼是在匿名評論者代碼上作了一些修改。它使用Git提交計數的版本號,可是若是它檢測
到咱們在Xcode使用調試生成配置,它會在版本號後加上當前分支的名字後綴。這避免了在並行
開發中不一樣分支版本號潛在的衝突2。
2014年9月14日-更新Johan庫爾,能夠說是在互聯網上最酷的名字,他糾正了個人新運行腳本
的一些潛在的問題。上面的腳本也已經更新。
嚴格來講,在2014就更名字了.
雖然不是一個大的問題,我不喜歡這個特定的生成,這將會致使難以識別的崩潰日誌。
這種在版本號後面加後綴的方法應該能夠解決這個問題。