2012-11-10 29 views
5

我用這個作爲我的項目構建階段:在構建時更新dSYM中的CFBundleShortVersionString?

export PLISTBUDDY="/usr/libexec/PlistBuddy" 

export INFO="${CODESIGNING_FOLDER_PATH}/Info.plist" 
export RXREVISION=`git describe --tags | perl -pi -E "s/[^-]+\-([^-]+).*/\1/"` 
export RXVERSION=`git describe --tags | perl -pi -E "s/([^-]+)\-[^-]+.*/\1/"` 
$PLISTBUDDY $INFO -c "add CFBundleVersion string $RXREVISION" 
$PLISTBUDDY $INFO -c "set :CFBundleVersion $RXREVISION" 
$PLISTBUDDY $INFO -c "add CFBundleShortVersionString string $RXVERSION" 
$PLISTBUDDY $INFO -c "set :CFBundleShortVersionString $RXVERSION" 

這完全適用於內置應用程序的Info.plist更新構建修訂,它不會發生變異我的源代碼樹。

我已經嘗試把我的更新版本腳本都放在末尾和鏈接階段之前。無論哪種方式,它都能夠影響對構建應用程序的更改,但是dSYM是從原始源代碼樹構建的。

構建的應用程序和構建的dSYM之間的版本號不匹配是個問題。 (HockeyApp在這裏拋出一個錯誤。)

如果我更新源代碼樹中的Info.plist,我需要處理它的變化。這給我兩個選項,我可以看到:

  1. 把Info.plist放在源代碼管理下,並讓腳本直接編輯它。但這意味着我需要在每次構建之後檢查更改。
  2. 忽略Info.plist,並讓腳本直接編輯它。但Info.plist中有很多其他的東西,我想在源代碼管理下想要

如何在dSYM中自動更新版本,而無需處理源代碼樹中的Info.plist更改每個版本?

另外,切向:我如何看到dSYM中的版本?

+0

我可能失去了一些東西,但瑣碎的解決方案,我想的是刪除的dSYM目錄,如果有什麼問題吧。如果您使用調試符號構建,則無論如何都會重新生成。 – 2012-11-10 16:25:08

+0

除非讓構建變更源樹,否則刪除dSYM並重建只會重新生成具有錯誤的CFBundleShortVersionString的dSYM。我希望構建不要操縱任何源代碼。 (顯然,我會做任何突變*我*需要做的,並檢查它是否正常工作,而不是每個構建。) –

+0

構建階段的執行順序是什麼?自定義階段何時執行? – Felix

回答

1

dSYM軟件包在根文件夾中也有一個類似值的info.plist。你也可以用類似的方式修改它。

另一種方法是在額外的.xcconfig文件中定義版本號,並在info.plist中包含版本號,參見here

然後,您也決定要哪種版本的或釋放或測試版本,通過使用多個獨立info.plist文件,並引用到不同.xcconfig文件生成設置和不包括一個用於測試構建源代碼控制之下。

一般來說,我會建議爲每個版本更改進行提交,因爲這會使代碼真正可重現,並且在源代碼管理系統中也可以唯一標識它。

除此之外,Apple指定將CFBundleVersion設置爲「單調增加的字符串,由一個或多個由句點分隔的整數組成」,請參閱hereCFBundleShortVersionString是您的營銷版本,例如你的目標是在版本3.0上工作。

因此,如何做以下的發佈版本:用新的版本號和CFBundleShortVersion與新營銷的版本一樣3.0 Beta 1更新CFBundleVersion並提交他們兩個,然後是提交發布標籤。版本號與其他任何元數據一樣都是源代碼的一部分,特別是如果版本號也用於觸發特定代碼以實現兼容性,數據庫升級或其他事情(通常會這樣做)。

+0

我實際上做的是從git標籤中拉出版本。因此,該版本位於源代碼管理中,它只是元數據的一部分,而不是主要數據。無論如何:我只是沒有看到Info.plist中的按鍵。謝謝! –

4

接受的答案是正確的,但沒有給出關於如何修改dsym的plist的實際細節。添加以下行構建腳本會修改DSYM plist中:

cd "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app.dSYM/Contents" 
$PLISTBUDDY -c "Set CFBundleVersion $RXREVISION" Info.plist 
+0

使用'「$ DWARF_DSYM_FOLDER_PATH/$ DWARF_DSYM_FILE_NAME/Contents/Info.plist」'可能更具前瞻性。 –

1

下面是「設置從混帳CFBundleVersion」的完整劇本構建階段我使用:

APP_INFO_PLIST="${TARGET_BUILD_DIR}/${INFOPLIST_PATH}" 
DSYM_INFO_PLIST="${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist" 

BUILD_NUMBER=`git rev-list HEAD --count` 

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$APP_INFO_PLIST" 
if [ -f "$DSYM_INFO_PLIST" ] ; then 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$DSYM_INFO_PLIST" 
fi 

(注它必須在Xcode 6)

+0

在xcode 7中不適用於我。在「複製捆綁軟件資源」之後運行。對存在的檢查通過了,但是當試圖通過xcode將應用程序部署到測試設備時仍然出現無法讀取錯誤。我應該尋找的任何其他設置? – lostintranslation

+0

@lostintranslation似乎不太可能與此步驟或Xcode 7有任何關係。 –

0

我創建了一個腳本,我可以放到任何Xcode項目文件夾,並從運行腳本調用,將更新的應用程序Info.plist中和後「複製包資源」運行dSYM這樣的構建號碼匹配。然後它可以上傳到像HockeyApp和iTunes Connect for TestFlight和App Store這樣的服務。

我更喜歡在Xcode的運行腳本之外管理腳本,因爲我可以更輕鬆地進行編輯並使項目文件的內容更小。我也可以獨立於項目文件版本控制腳本。這個腳本中的Build Number只設置當前日期。還有其他方法可以生成唯一的內部版本號。 Jared Sinclair的博客介紹了一種方法,它使用Git hash作爲最新的提交。我正在使用的腳本使用的時間戳記下降到一分鐘。我發現知道何時創建構建並將構建編號加倍作爲時間戳,我可以立即看到日期。而對於我的目的來說,它足夠獨特。

http://blog.jaredsinclair.com/post/97193356620/the-best-of-all-possible-xcode-automated-build

#!/bin/sh 
set -e 

# Purpose: Updates Info.plist for app and dSYM to a unique value for each build. 

# Usage: 
# Add as a Run Script in Xcode Build Phases 

# UPDATE_SCRIPT=${PROJECT_DIR}/update_build_number.sh 
# if [ -f ${UPDATE_SCRIPT} ]; then 
#  sh ${UPDATE_SCRIPT} 
# fi 

BUILD_NUMBER=`date "+%Y.%m.%d.%H%M"` 
APP_INFO_PLIST=${TARGET_BUILD_DIR}/${INFOPLIST_PATH} 
DSYM_INFO_PLIST=${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist 

if [ -f ${APP_INFO_PLIST} ]; then 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${APP_INFO_PLIST}" 
    echo "Updated ${APP_INFO_PLIST}" 
else 
    echo "Could not find ${APP_INFO_PLIST}" 
fi 

# Only the Release Configuration creates the dSYM 
if [ "${CONFIGURATION}" = 'Release' ]; then 
    if [ -f ${DSYM_INFO_PLIST} ]; then 
     /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${DSYM_INFO_PLIST}" 
     echo "Updated ${DSYM_INFO_PLIST}" 
    else 
     echo "Could not find ${DSYM_INFO_PLIST}" 
    fi 
fi 
相關問題