4

XCode で次のコマンドを実行しようとしており、それを C/C++ フラグとして追加して、プロジェクトの実行スクリプト フェーズで実行されるシェル スクリプトからビルド番号を取得できます。

これは、別の Unix ライクなシステムの GCC で問題なく動作します。

-D__BUILD_VERSION=$(cat ビルド番号)

そして、OK XCode Imは以下を使用しようとしています:

-D__BUILD_VERSION=$(cat $PROJECT_DIR/build_number)

しかし、それはうまくいきません。私は何を間違っていますか? XCode で、cat build_number の結果を __BUILD_VERSION 定義変数に割り当てるにはどうすればよいですか?

4

3 に答える 3

1

Xcode コンパイルのビルド段階でその値を設定しようとしている場合、設定しようとしている方法で設定しようとしている設定で解釈操作が行われることを知らないため、問題が発生する可能性があります。それらをアップします。

バージョン番号を自動設定するために、私ははるかに複雑な半自動バージョンと自動番号付けスキームを持っているので、どちらかを変更することを覚えておく必要はありません。または、必要なバージョン番号を与えることができますが、常に増分しますどちらの場合も、iOS システム設定に表示されるアプリ設定の [バージョン情報] ボックスにビルド番号が表示されます。

あまり必要ないかもしれませんが、情報を取得して書き込むためのいくつかのトリックがあり、役立つと思われ、問題の解決につながる可能性があります。


次のスクリプトは、現時点では見つけることができないこれを行う方法についてのスタックオーバーフローの回答に触発されました。(a)システム設定に表示される設定にバージョン番号を表示したいので、もう少し作業を行いました。(b) Xcode は Info.plist ファイルの内容をキャッシュするため、これを行うことは私が期待したほど単純ではありません。

コンパイル前のビルドフェーズで、次を実行します(チェックを外してインストールする場合にのみスクリプトを実行 します)

sh xolawareStashProductSettings.sh

xolawareStashProductSettings.sh の内容は、info.plist ファイルの git ステータスをチェックし、クリーンでない場合は、後で復元するために一時的に保管します。

#!/bin/sh

#
# should be run prior to the Copy Bundle Resources step
# and prior to any version information modifier scripts

INFOPLIST_GIT_PATH=${PROJECT}/`basename ${INFOPLIST_FILE}`
echo "-- Temp Hold ${INFOPLIST_GIT_PATH} Script --"

set -e

# a fallback in case the user has made changes to the file
if [ `git status --porcelain ${INFOPLIST_GIT_PATH} ]|wc -l` -gt 0 ]; then
    echo cp -p ${INFOPLIST_GIT_PATH} ${TARGET_TEMP_DIR}
    cp -p ${INFOPLIST_GIT_PATH} ${TARGET_TEMP_DIR}
fi

スクリプト #2 (未チェックのインストール時にのみスクリプトを実行 ):

sh xolawareStashSettingsBundleRootPlist.sh

xolawareStashSettingsBundleRootPlist.sh の内容は、スクリプト 1 の内容と似ています。

#!/bin/sh
#
# should be run prior to the Copy Bundle Resources step
# and prior to any version information modifier scripts

echo '-- Temp Hold Settings.bundle/Root.plist Script --'

ROOT_PLIST=${PROJECT}/Resources/Settings.bundle/Root.plist

set -e

# a fallback in case the user has made changes to the file
if [ `git status --porcelain ${ROOT_PLIST} ]|wc -l` -gt 0 ]; then
    echo cp -p ${ROOT_PLIST} ${TARGET_TEMP_DIR}
    cp -p ${ROOT_PLIST} ${TARGET_TEMP_DIR}
fi

スクリプト #3 ([インストール時にのみスクリプトを実行] チェック ボックスをオン)

sh xolawareIncrementProductSettingsBuildNumber.sh

xolawareIncrementProductSettingsBuildNumber の内容は、plistbuddy を使用してそれが何であるかを確認し、1 つ増やします。

#!/bin/sh
#
# this should be prior to xolawareAboutInfoVersionInfoInSettings.sh

echo "-- Auto-Increment ${INFOPLIST_FILE} Build Version Install Script --"

PLISTBUDDYCMD="/usr/libexec/PlistBuddy -c"
CONFIGURATION_BUILD_SETTINGS_PATH=${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}

CFBV=$(${PLISTBUDDYCMD} "Print :CFBundleVersion" ${PRODUCT_SETTINGS_PATH})
if [[ "${CFBV}" == "" ]]; then
    echo "No build number in ${PRODUCT_SETTINGS_PATH}"
    exit 2
fi

CFBV=$(expr $CFBV + 1)

set -e
echo ${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${PRODUCT_SETTINGS_PATH}"
${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${PRODUCT_SETTINGS_PATH}"
echo ${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${CONFIGURATION_BUILD_SETTINGS_PATH}"
${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${CONFIGURATION_BUILD_SETTINGS_PATH}"

スクリプト #4 (インストール時にのみスクリプトを実行する のチェックを外した場合)

sh xolawareProductSettingsShortVersion-from-git.sh
sh xolawareAboutInfoVersionInfoInSettings.sh

xolawareProductSettingsShortVersion-from-git の内容は、git で自分のブランチに適切にタグを付けることに少し依存していますが、忘れた場合は、最後のコミット以降のコミット数を使用して、ビルドを自動バージョン管理します。

#!/bin/sh
#
# this should be run after xolawareStashSettingsBundleRootPlist.sh
# and prior to xolawareAboutInfoVersionInfoInSettings.sh

echo '-- Get Product Settings Short Version String from git describe --'

PLISTBUDDYCMD="/usr/libexec/PlistBuddy -c"
CONFIGURATION_BUILD_SETTINGS_PATH=${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}

CFBVS=`git describe|awk '{split($0,a,"-"); print a[1]}'`
CFBVSI=`git describe|awk '{split($0,a,"-"); print a[2]}'`
if [[ "$CFBVSI" != "" ]]; then
    CFBVS=${CFBVS}.${CFBVSI}
fi

set -e
echo ${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${PRODUCT_SETTINGS_PATH}"
${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${PRODUCT_SETTINGS_PATH}"
echo ${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${CONFIGURATION_BUILD_SETTINGS_PATH}"
${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${CONFIGURATION_BUILD_SETTINGS_PATH}"

xolawareAboutInfoVersionInfoInSettings.sh の内容は、私の Root.plist の About ボックスに配置されます。settings.bundle の Root.plist の最初にある About ボックスに依存しています。

#!/bin/sh
#
# this should be invoked after xolawareStashInfoAndRootPlist.sh,
# xolawareIncrementProductSettingsBuildNumber.sh and 
# xolawareProductSettingsShortVersion-from-git.sh, and before
# the regular Copy Bundle Resources Build Phase

echo '-- Auto-Insert Version Info In System Settings Script --'

PLISTBUDDYCMD="/usr/libexec/PlistBuddy -c"
ROOT_PLIST=${PROJECT_DIR}/${PROJECT}/Resources/Settings.bundle/Root.plist

CFBSVS=`exec -c ${PLISTBUDDYCMD} "Print :CFBundleShortVersionString" ${PRODUCT_SETTINGS_PATH}`
CFBV=`exec -c ${PLISTBUDDYCMD} "Print :CFBundleVersion" ${PRODUCT_SETTINGS_PATH}`

set -e
echo ${PLISTBUDDYCMD} "Set :PreferenceSpecifiers:1:DefaultValue '${CFBSVS} (b${CFBV})'" ${ROOT_PLIST}
${PLISTBUDDYCMD} "Set :PreferenceSpecifiers:1:DefaultValue '${CFBSVS} (b${CFBV})'" ${ROOT_PLIST}

コンパイル、リンク、およびバンドル リソースのコピー フェーズの後に実行するクリーンアップ スクリプトもいくつかあります。

sh xolawareStashRestoreSettingsBundleRootPlist.sh

これは必要ないかもしれませんが、リリース ビルド用に Root.plist の他の項目を調整するので、デバッグ ビルド用にこれらの設定が復元されます。

#!/bin/sh
#
# should be run as the second to last script in Build Phases, after the Copy Bundle Resources Phase

echo "-- Manual Restore $INFOPLIST_FILE Script --"

ROOT_PLIST=${PROJECT}/Resources/Settings.bundle/Root.plist

set -e

# first, see if it was stashed earlier due to uncommitted changes
if [ -e ${TARGET_TEMP_DIR}/Root.plist ]; then
    echo mv ${TARGET_TEMP_DIR}/Root.plist ${ROOT_PLIST}
    mv ${TARGET_TEMP_DIR}/Root.plist ${ROOT_PLIST}

# the better option when available: restore to the pristine state
elif [ `git status --porcelain ${ROOT_PLIST}|wc -l` -gt 0 ]; then
    echo git checkout -- ${ROOT_PLIST}
    git checkout -- ${ROOT_PLIST}
fi

そして最後に、自分でまだアイテムにタグを付けていない場合に、git リポジトリに自動タグを付ける手順:

sh xolawareProductSettings-git-commit-and-tag.sh


#!/bin/sh
#
# this should be run after xolawareAboutInfoVersionInfoInSettings.sh
# and xolawareProductSettingsShortVersion-from-git.sh

echo "-- ${INFOPLIST_FILE} git commit & tag Install Script --"

SCRIPT_VERSION=`/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' ${INFOPLIST_FILE}`
SCRIPT_BUILD_NUMBER=`/usr/libexec/Plistbuddy -c 'Print :CFBundleVersion' ${INFOPLIST_FILE}`
if [ `git status --porcelain ${SCRIPT_INFO_PLIST}|wc -l` -gt 0 ]; then
    echo git commit -m '"'version ${SCRIPT_VERSION} build ${SCRIPT_BUILD_NUMBER}'"' ${INFOPLIST_FILE}
    git commit -m "version ${SCRIPT_VERSION} build ${SCRIPT_BUILD_NUMBER}" ${INFOPLIST_FILE}
fi
echo git tag -f ${SCRIPT_VERSION}
git tag -f -F /dev/null ${SCRIPT_VERSION}
于 2013-02-09T10:16:21.383 に答える
0

1 つの可能性は、最初のスクリプトでビルド番号を環境変数に入れることでしょうか? それがうまくいくかどうかはわかりませんが、うまくいくかもしれません。

于 2013-02-08T05:14:48.697 に答える
0

試す:

-D__BUILD_VERSION=`cat $PROJECT_DIR/build_number`

「バッククォート」に注意してください。これらは通常の一重引用符ではありません。

于 2013-02-04T03:46:13.387 に答える