137

Xcode ビルド プロセスの一部としてシェル スクリプトを使用して、plistファイル内のビルド番号をインクリメントしていますが、Xcode 4.2.1 が頻繁にクラッシュします (ターゲットがプロジェクトに属していないというエラーが発生します。推測しています)。plistファイルを変更すると、何らかの形で Xcode が混乱します)。

シェル スクリプトはこれを行い、ファイルがplistagvtoolファイルよりも新しい場合にのみビルド番号がインクリメントされるようにしました(したがって、ビルドだけでは値がインクリメントされませんでした)。

if [ -n \"`find ProjDir -newer ProjDir/Project-Info.plist`\" ]; then agvtool -noscm next-version -all; else echo \"Version not incremented\"; fi

Xcode を壊さずに( plistファイルやその他の場所で)ビルド番号をインクリメントする方法はありますか?

最終編集: 私は今、githubで公開したばかりの python スクリプトを使用して、この種のことを行います。十分に文書化されていませんが、解決するのは難しくありません。おまけとして、このリポジトリには、サードパーティのライブラリをアプリ バンドルに自動的にバンドルするための便利なスクリプトも含まれています。

4

22 に答える 22

77

私はこの質問について多くの答えをいじりましたが、どれも私を完全に満足させるものはありませんでした. しかし、ついに私が本当に好きな混合物を思いつきました!

ビルドされた製品のバージョン番号を Git コミットの数に設定するだけです。スクリプトはビルドされた製品のみを変更するため、これによってソース管理が混乱することはありません。

この「スクリプトの実行」ビルド フェーズをビルド フェーズの最後に追加します。

if [ "${CONFIGURATION}" = "Release" ]; then
    buildNumber=$(git rev-list --count head)
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
fi

プロジェクトの Info.plist バージョンを任意のバージョンに設定します。リリース ビルドをビルドするときに使用されることはありません。開発ビルドを実行しAUTOMATEDDEVELOPMENTいるときは明らかです。

それでおしまい!ビルドされたアプリのビルド番号は常に増加します。(常に同じブランチからビルドを行う限り。)

この方法が好きな理由:

  • 簡単
  • Git のバージョン履歴を汚さない
  • CFBundleVersion は完全に自動化されています
  • きれいなバージョン番号はいつでも変更できます

その他の注意事項:

  • プロジェクトにアプリ拡張機能がある場合は、それらのターゲットにも同じビルド スクリプトを設定するだけです。これにより、すべてのバージョン番号が自動化され、同期されます。App Store では、拡張機能のバージョンがメイン アプリと一致する必要があります。
于 2014-07-15T05:24:45.380 に答える
38

私はこのglistを使用しました。期待どおりに動作します。 https://gist.github.com/sekati/3172554 (すべてのクレジットは元の作成者に帰属します)

時間の経過とともに変更したスクリプト。

xcode-versionString-generator.sh

xcode-build-number-generator.sh

これらの要点が開発コミュニティを支援しているので、私はそれからGitHubプロジェクトを作成しました。それでは、それをうまく開発しましょう。GitHubプロジェクトは次のとおりです: https ://github.com/alokc83/Xcode-build-and-version-generator

両方のスクリプトのコードを少し拡張しました。以下を使用する代わりに、GitHubから最新のものを入手してください

バージョンの場合:

# xcode-version-bump.sh
# @desc Auto-increment the version number (only) when a project is archived for export. 
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Check the checkbox "Run script only when installing"
# 6. Drag the "Run Script" below "Link Binaries With Libraries"
# 7. Insure your starting version number is in SemVer format (e.g. 1.0.0)

# This splits a two-decimal version string, such as "0.45.123", allowing us to increment the third position.
VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
NEWSUBVERSION=`echo $VERSIONNUM | awk -F "." '{print $3}'`
NEWSUBVERSION=$(($NEWSUBVERSION + 1))
NEWVERSIONSTRING=`echo $VERSIONNUM | awk -F "." '{print $1 "." $2 ".'$NEWSUBVERSION'" }'`
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $NEWVERSIONSTRING" "${PROJECT_DIR}/${INFOPLIST_FILE}"

ビルドの場合:

# xcode-build-bump.sh
# @desc Auto-increment the build number every time the project is run. 
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below into new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Ensure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
于 2013-03-18T18:12:16.613 に答える
29

私があなたの質問を正しく理解しているなら、あなたProject-Info.plistはXcodeの標準プロジェクトテンプレートの一部であるファイルを修正したいですか?

私がこれを尋ねる理由は、Project-Info.plist通常はバージョン管理下にあり、それを変更すると、変更済みとしてマークされることを意味します。

それで問題がなければ、次のスニペットはビルド番号を更新し、ファイルをプロセスで変更済みとしてマークします。ここget_build_numberで、スクリプト(この例ではプレースホルダー)を使用して、(場合によってはインクリメントされた)ビルド番号を取得します。使用したい:

#!/bin/sh

# get_build_number is a placeholder for your script to get the latest build number
build_number = `get_build_number`

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${build_number}" ProjDir/Project-Info.plist

PlistBuddyを使用すると、バージョン番号だけでなく、plistファイルに任意のキーを設定できます。必要なすべてのplistファイルを作成し、必要に応じてそれらをリソースに含めることができます。その後、バンドルから読み込むことができます。

CFBundleGetInfoStringアバウトペインなどにバージョンを表示する必要がある場合は、設定やを調べることもできますCFBundleShortVersionString

于 2012-02-15T14:12:35.423 に答える
14

このエントリ全体が非常に役に立ちました。私はこのトリックを使用しましたが、スクリプトをGITのコミット後フックとして設定したため、コミットが成功するたびにCFBundleVersionがインクリメントされます。フックスクリプトは.git/hooksに入ります。ログはプロジェクトディレクトリに残されます。

これは私の最も基本的な基準を満たしています。GITからバージョンをプルして、以前に持っていたものとまったく同じビルドを再構築できるようにしたいと思います。ビルドプロセス中に行われた増分は、これを行いません。

これが私のスクリプトです:

#!/bin/sh
#
# post-commit
#
# This script increments the CFBundleVersion for each successful commit
#

plist="./XYZZY/XYZZY-Info.plist"
buildnum=$(/usr/libexec/Plistbuddy -c "Print CFBundleVersion" "$plist")
if [ -z "$buildnum" ]; then
    exit 1
fi
buildnumplus=$(expr $buildnum + 1)
/usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnumplus" "$plist"

echo $(date) "- Incremented CFBundleVersion to" $buildnumplus >> hookLog.txt
于 2013-02-07T17:38:57.613 に答える
14

どちらの方法が最適かはわかりませんが、誰かが検索している場合に備えて、Apple の回答を投稿します...

このAppleのQ&A投稿によると:

agvtool を使用したバージョン番号とビルド番号の自動化

バージョン キーとビルド番号キーは、アプリケーションのマーケティング バージョンと内部バージョンをそれぞれ指定します。agvtool は、これらの数値を次に大きい数値または特定の数値に自動的にインクリメントできるコマンドライン ツールです。

ビルド番号は、アプリケーションの未リリース バージョンまたはリリース バージョンを識別します。アプリケーションの Info.plist にCFBundleVersion(バンドル バージョン) として保存されます。

Xcode プロジェクトで次の手順を完了する必要があります。

  1. agvtool を有効にする

ターゲットの [ビルド設定] ペインに移動し、次のようにすべてのビルド構成に対して更新します。

  • 現在のプロジェクト バージョンを選択した値に設定します。

Xcode プロジェクト データ ファイル project.pbxproj には、プロジェクトCURRENT_PROJECT_VERSIONの現在のバージョンを指定する (現在のプロジェクト バージョン) ビルド設定が含まれています。agvtool は project.pbxproj で を検索しCURRENT_PROJECT_VERSIONます。存在する場合は実行を継続し、CURRENT_PROJECT_VERSION存在しない場合は実行を停止します。その値は、ビルド番号を更新するために使用されます。

  • バージョン管理システムを Apple Generic に設定します。

デフォルトでは、Xcode はバージョン管理システムを使用しません。Versioning System を Apple Generic に設定すると、Xcode は agvtool によって生成されたすべてのバージョン情報をプロジェクトに含めることができます。

バージョニング システムを Apple Generic に設定する

  1. バージョンとビルド番号を設定する

agvtool は、アプリケーションの Info.plist からバージョン番号とビルド番号を検索します。存在する場合は更新し、存在しない場合は何もしません。下の画像に示すように、 Info.plist にCFBundleVersion(バンドル バージョン) およびCFBundleShortVersionString(バンドル バージョンの文字列、短い) キーが存在することを確認します。

バージョンとビルド番号を設定する

Xcode を終了し、次のコマンドを実行する前に、ターミナル アプリケーションで .xcodeproj プロジェクト ファイルを含むディレクトリに移動します。.xcodeproj プロジェクト ファイルには、agvtool で使用される project.pbxproj が含まれています。(これは、コマンド ラインではなくスクリプトで実行できる部分です。)

バージョン番号の更新

バージョン番号を特定のバージョンに更新するには、次を実行します。

xcrun agvtool new-marketing-version <your_specific_version>

例:バージョン番号を 2.0 に更新する

xcrun agvtool new-marketing-version 2.0

ビルド番号の更新

ビルド番号を自動的にインクリメントするには、次を実行します

xcrun agvtool next-version -all

アプリケーションのビルド番号を特定のバージョンに設定するには、次を実行します。

xcrun agvtool new-version -all <your_specific_version>

例:ビルド番号を 2.6.9 に設定します

xcrun agvtool new-version -all 2.6.9

ボーナス:

現在のバージョン番号を表示するには、次を実行します

xcrun agvtool what-marketing-version

現在のビルド番号を表示するには、次を実行します

xcrun agvtool what-version
于 2016-02-25T02:35:49.500 に答える
11

FWIW - これは、リリース ビルド(アーカイブを含む)のビルド番号のみを増やすために現在使用しているものです。Xcode 5.1 で正常に動作します。

スニペットをコピーして Xcode のRun scriptビルド フェーズに直接貼り付けるだけです。

buildnum=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$PRODUCT_SETTINGS_PATH")

if [ "$CONFIGURATION" = "Release" ]; then
buildnum=$((buildnum + 1))
echo "Build number updated to $buildnum"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildnum" "$PRODUCT_SETTINGS_PATH"
fi;
于 2014-03-31T20:15:01.463 に答える
7

スクリプトをありがとう。それは素晴らしい働きをします。

私のInfo.plistは、スペースを含む名前のサブディレクトリにあるため、plistパスを引用符で囲んで実行スクリプトを変更する必要がありました。

${PROJECT_DIR}/tools/bump_build_number.sh "${PROJECT_DIR}/${INFOPLIST_FILE}"

シェルスクリプトも同じように、すべてのパスを引用符で囲みます。

#!/bin/sh

if [ $# -ne 1 ]; then
    echo usage: $0 plist-file
    exit 1
fi

plist=$1
dir=$(dirname "$plist")

# Only increment the build number if source files have changed
if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
    buildnum=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$plist")
    if [ -z "$buildnum" ]; then
        echo "No build number in $plist"
        exit 2
    fi
    buildnum=$(expr $buildnum + 1)
    /usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "$plist"
    echo "Incremented build number to $buildnum"
else
    echo "Not incrementing build number as source files have not changed"
fi
于 2012-07-02T23:19:57.967 に答える
6

私が現在使用しているスクリプトは、上記の Alix のに非常に基づいています。以下の私の適応は、リリース/アーカイブビルドで自動インクリメントのみを行うチェックを追加します。

その変更がないと、各開発者が独自の速度でビルド番号をインクリメントするため、バージョン管理の競合が発生します。そして、ビルド番号が常に変化することで、git履歴が不必要に汚染されるという事実。

# xcode-build-bump.sh
# @desc Auto-increment Xcode target build number every time the project is archived
# @src stackoverflow.com/a/15483906
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

if [ "Release" != "${CONFIGURATION}" ]
then
    exit 0
fi

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

GitHub gistとしても利用できます (コピーして貼り付けるのが少し簡単な形式です) 。

于 2015-03-28T18:09:19.717 に答える
5

autorevisionの使用をお勧めします。

Xcode では、ビルド時に info.plist で展開される値を提供するために、ヘッダー ファイル (ビルド時に自動生成でき、vcs 自体では生成できません) が可能です。これを設定するためのウォークスルーは、autorevision の Web サイトにあります。

Autorevision には、これらのタイプのヘッダー ファイルを対象とした出力タイプがあり、まさにこれらの状況で役立ちます。

于 2013-08-29T02:47:03.260 に答える
4

これらのソリューションの一部の問題の 1 つは、Launch Servicesがバンドル バージョンの4つの主要な 5 桁しか認識しないことです。数千のビルド番号を持つプロジェクトがあるため、重要度の低い数字を使用したいと考えていました。

この Perl スクリプトは、現在のターゲットの 1 つだけでなく、プロジェクト内のすべての Info.plists をインクリメントするため、ビルド番号はすべてロックステップのままです。また、1 つのパッチ ディジットと 2 つのマイナー ディジットを使用するため、ビルド 1234 にはバージョン 1.23.4 が与えられます。ビルド前の動作として使用するため、ビルドするすべてのプロジェクトに適用されます。

スクリプトはかなり強引ですが、私にとってはうまくいきます。

#!/usr/bin/perl

use strict;
use warnings;
use v5.12.0;

use Dir::Iterate;

for my $plist_file(grepdir { /-Info.plist$/ } '.') {
    my $build = `/usr/libexec/PlistBuddy -c "Print CFBundleVersion" '$plist_file'`;
    chomp $build;

    next unless $build;

    # Strip dots
    $build =~ s/\.//g;
    $build =~ s/^0//g;

    # Increment
    $build++;

    # Re-insert dots
    $build =~ s/^(\d{0,4}?) (\d{0,2}?) (\d{0,1}?)$/$1.$2.$3/x;

    # Insert zeroes
    $build =~ s{(^|\.)\.}{${1}0.}g;

    system qq(/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build" '$plist_file');
}
于 2013-05-16T10:19:14.293 に答える
2

これは、アーカイブする場合(および TF にアップロードする場合など) にのみ実行することをお勧めします。そうしないと、バージョン番号がすぐに上がる可能性があります..

スキーム (Product / Edit Scheme / Archive / Pre-Actions) では、アーカイブ時にのみ実行されるスクリプトを追加できます。

また、アプリのバージョンを増やすたびにビルド番号をリセットすることもできます。

最後に、代わりにアーカイブを使用する場合は、安全に無効にすることができます:

# if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
...
# else
    # echo "Not incrementing build number as source files have not changed"
# fi

ビルド番号はアーカイブ時にのみインクリメントされるため...

編集:私が言ったことを修正してください。アーカイブの事前アクションはビルド後(ただしアーカイブ前)に発生するため、ビルド番号は次のアーカイブの増分になります...ただし、新しいスキームを作成して、ビルドにこのアクションを追加できます(pre-アクション) この新しいスキームのセクション。新しいビルドを作成するときにこのスキームを使用します

于 2012-12-18T03:23:18.497 に答える
2

変更した手順を試しましたが、うまくいきませんでした。

  1. Xcode 4.2.1 は .xcodeproj の xcuserdata サブディレクトリを変更します

  2. git は Project-Info.plist の以前の変更を記録します

次の変更により、これらが無視され、本物の変更のみがフラグ付けされます:-

if [ -n "$(find $dir \! -path "*xcuserdata*" \! -path "*.git" -newer $plist)" ]; then
于 2012-04-09T05:17:28.443 に答える
0

これが私の解決策です。あなたが私のような人なら: ターミナルフレンドリーで、Ruby が好きで、セマンティックバージョニングが好きなら、これを試してみてください。

Rakefileこれを含む名前のファイルを作成します。

require "xcodeproj"
require "versionomy"

XCODEPROJECT = "MyProject.xcodeproj"
INFOPLISTFILE = "MyProject/MyProject-Info.plist"

$UPDATES = [:major,:minor,:tiny]
$UPDATES.each { |part|
  desc "increment #{part} part of version"
  task "increment:#{part}" do |task|
    version=`/usr/libexec/Plistbuddy -c "Print CFBundleVersion" #{INFOPLISTFILE}`.chomp
    version=Versionomy.parse(version)
    version=version.bump(part)

    # I use the same string for CFBundleVersion and CFBundleShortVersionString for now
    `/usr/libexec/PlistBuddy -c "Set :CFBundleVersion #{version}" #{INFOPLISTFILE}`
    `/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString #{version}" #{INFOPLISTFILE}`
    print "version upgraded to #{version}\n"
  end
}

準備:gem install xcodeproj versionomy

実行:rake increment:majorまたは またはrake increment:minorまたはrake increment:tinyいつでも実行できます。

于 2014-07-28T11:12:43.957 に答える