6

私はこれをプロジェクトのビルドフェーズとして使用しています。

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を更新する場合は、変更に対処する必要があります。それは私が見ることができる2つのオプションを私に残します:

  1. Info.plistをソース管理下に置き、スクリプトに直接編集させます。ただし、これは、ビルドごとに変更をチェックインする必要があることを意味します。
  2. Info.plistを無視し、スクリプトに直接編集させます。しかし、Info.plistには、ソース管理下で必要なものが他にもたくさんあります。

ソースツリーのInfo.plistを処理してビルドごとに変更することなく、dSYMのバージョンを自動的に更新するにはどうすればよいですか?

また、接線方向:dSYMでバージョンを確認するにはどうすればよいですか?

4

4 に答える 4

4

受け入れられた答えは正しいですが、dsymのplistを変更する方法の実際の詳細は示されていません。ビルドスクリプトに次の行を追加すると、dsymのplistが変更されます。

cd "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app.dSYM/Contents"
$PLISTBUDDY -c "Set CFBundleVersion $RXREVISION" Info.plist  
于 2014-01-28T10:06:28.397 に答える
2

これが、私が使用している「SetCFBundleVersionfromgit」ビルドフェーズの完全なスクリプトです。

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以降の「バンドルリソースのコピー」の後に実行する必要があることに注意してください。Xcode10の新しいビルドシステムでは、入力ファイルの一部としてInfo.plistファイルを指定してください。)

于 2014-11-30T14:33:35.737 に答える
1

dSYMパッケージのルートフォルダにも、同様の値を持つinfo.plistがあります。おそらくそれも同様の方法で変更できます。

別のオプションは、追加のファイルでバージョン番号を定義し.xcconfig、info.plistのバージョン番号をそのファイルに含めることです。ここを参照してください。

info.plist次に、複数の独立したファイルを使用し、ビルド設定で異なる.xcconfigファイルを参照し、ソース管理下のテストビルド用のファイルを含めないことで、必要なバージョン管理の種類を決定したり、ビルドをリリースまたはテストしたりできます。

一般に、バージョンが変更されるたびにコミットを行うことをお勧めします。これにより、コードが実際に再現可能になり、ソース管理システムで一意に識別されるためです。

それとは別に、AppleCFBundleVersionは「1つ以上のピリオドで区切られた整数で構成される単調に増加した文字列」に設定するように指定しています。ここを参照してください。CFBundleShortVersionStringはマーケティングバージョンです。たとえば、目標はバージョンで作業すること3.0です。

では、リリースビルドに対して次のことを行うのはどうでしょうか。CFBundleVersion新しいビルド番号とCFBundleShortVersion新しいマーケティングバージョンで更新し、3.0 Beta 1両方をコミットしてから、そのコミットにリリースのタグを付けます。バージョン番号は、他のメタデータと同様にソースの一部です。特に、バージョン番号が互換性、データベースのアップグレード、またはその他のこと(多くの場合行われる)のために特定のコードをトリガーするためにも使用される場合はそうです。

于 2012-11-11T13:59:39.673 に答える
0

任意のXcodeプロジェクトフォルダーにドロップして、ビルド番号が一致するようにアプリとdSYMのInfo.plistを更新するスクリプトの実行から呼び出すことができるスクリプトを作成しました。その後、HockeyAppやiTunes ConnectforTestFlightやAppStoreなどのサービスにアップロードできます。

スクリプトを編集しやすく、プロジェクトファイルの内容をはるかに小さく保つことができるため、XcodeのRunScriptの外部でスクリプトを管理することを好みます。プロジェクトファイルとは別にスクリプトをバージョン管理することもできます。

このBuild Numberスクリプトのは、現在の日付だけで設定されています。一意のビルド番号を生成する方法は他にもあります。1つのアプローチは、最新のコミットにGitハッシュを使用するJaredSinclairのブログで取り上げられています。私が使用しているスクリプトは、1分に短縮されるタイムスタンプを使用しています。ビルドがいつ作成されたかを知り、ビルド番号をタイムスタンプとして使用すると、日付をすぐに確認できるので便利です。そして私の目的のために、それは十分にユニークです。

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
于 2015-12-30T20:31:32.257 に答える