ビルド番号を増やすより良い方法は?


133

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

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

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スクリプトを使用して、この種のことを行います。十分に文書化されていませんが、解決するのは難しくありません。おまけとして、このリポジトリには、サードパーティライブラリをアプリバンドルに自動的にバンドルするための便利なスクリプトも含まれています。


1
誰かが興味を持っている場合:10進数の代わりに16進数を使用するようにスクリプトを少し変更しました-gist.github.com/sascha/5398750
Sascha

1
このスクリプトをビルド前のアクションとして直接追加できます。外部スクリプトを呼び出す必要はありません。このスクリプトをビルドフェーズで実行しないでください。Xcodeは、更新されたplistを他のすべてのビルドでのみコピーします。
Ed McManus

3
すぐに「許可が拒否されました」エラーが発生したため、同じことを経験する他の人にこのQ&Aを指摘したいと思いました: stackoverflow.com/q/9850936/519030
Jason

このスクリプトは、終了コード1で失敗します。誰かがこれを手伝ってくれませんか?
ロバートJ.クレッグ

@Tanderスクリプトの引数としてplistファイルを指定していないようです。
trojanfoe

回答:


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


私はgit commit(またはタグ)を必要としません plistファイルにため、単純なインクリメントシステムで問題(で提供agvtool)。ただし、ビルド中にplistを変更すると、Xcodeが頻繁に壊れます(スクリプトが削除されているため) tは1回クラッシュしましたが、3ビルドごとにクラッシュしていました)。バージョン情報を別のplistファイルに入れて、バンドルに含め、アプリからアクセスできるようにすることはできますか?
trojanfoe

素晴らしいスクリプト-これをHugues BRの提案と組み合わせて、ビルドのアーカイブ時にのみ使用することをお勧めします。数を低く保ち、無視しますが、リリース間で多くの開発ビルドが実行されます。
ジェイ

5
get_build_numberとは何ですか?それは単なるプレースホルダーですか?
14

はい、get_build_number単なるプレースホルダーです-明確にするために回答を更新しました。
Monolo 2018

72

私はこの質問について多くの答えをいじりましたが、どれも私を完全に満足させるものはありませんでした。しかし、私はようやく本当に好きなミックスを思いつきました!

ビルドフェーズの最初と最後の2つのステップがあります。

最初に:

# Set the build number to the count of Git commits
if [ "${CONFIGURATION}" = "Release" ]; then
    buildNumber=$(git rev-list HEAD | wc -l | tr -d ' ')
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
fi

最後に:

# Set the build number to "DEVELOPMENT"
if [ "${CONFIGURATION}" = "Release" ]; then
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"
fi

XcodeのInfo.plistを見ると、バージョン番号が「DEVELOPMENT」であることがわかりますが、ビルドされたアプリのビルド番号は常に増加しています。(常に同じブランチからビルドを行う限り)。

最後にバージョン番号を定数文字列に戻すと、アプリをビルドしてInfo.plistファイルが変更されるのを防ぐことができます。

この方法が好きな理由:

  • かんたん
  • Gitのバージョン履歴を汚染しない
  • CFBundleVersionは完全に自動です
  • かなりのバージョン番号はいつでも変更できます

バージョン管理されたplistファイルからバージョン番号を除外することは、特にリリースごとにブランチがあり、マージまたはチェリーピックが必要な場合に、これを行うための最良の方法です。ありがとう!
マシューフィリップス

14
git rev-list --count HEAD代わりに使用できますgit rev-list HEAD | wc -l | tr -d ' '
kennytm 2015年

うーん。を使用fastlaneして自動ビルドをこの方法でアップロードすると、次のエラーが発生することがわかりました。エラーITMS-90058:「このバンドルは無効です。Info.plistファイルのキーCFBundleVersion [DEVELOPMENT]の値は、ピリオドで区切られたリストでなければなりませんほとんどの3つの非負の整数。」
fatuhoku 2015年

1
私はそれがどこに行くべきか正確にわかりません、私は最初のスクリプトを最初のビルドフェーズとして置き、最後のスクリプトを最後のビルドフェーズとして入れ、それは私のために機能します。
Wil Gieseler、2015

1
このソリューションを使用して、Info.plistを確実にコミットできます。Info.plistは常に設定され、バージョン番号が「DEVELOPMENT」に設定された状態でチェックインされます。ビルドプロセス中に一時的に変更され、その後再び「DEVELOPMENT」に設定されるため、Info.plistは安定しています。
Wil Gieseler 2018年

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}"

これは常にビルド番号をインクリメントしますが、ソースファイルが変更された場合にのみインクリメントします。これは、私が現在使用しているスクリプトであり、安全性チェックが少なく、変更点に対する認識力が低くなっています。
trojanfoe

XCode 5:エディター(メニューバー)→ビルドフェーズの追加→ファイルのコピービルドフェーズの追加:
Jonny

@trojanfoe:このスクリプトは、コミット後フックとして実行できます。このシナリオでは、コードをリポジトリにコミットしたときにのみビルド番号が増加します。LostInTheTreesからの以下の回答は、あなたがやりたいことがもっとあるものです。
Alix

@Alixによってリンクされたシェルスクリプトは、ここに投稿されたものとはかなり異なります。アーカイブビルドを実行するときにのみビルド番号を増やすには、上記のAlixのスクリプトに非常に基づいて、私が作成した要点を使用できます。ここでは、gist.github.com
Matthew

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

同じ要件があります。そのため、ソースファイルが変更された場合にのみビルド番号が増分されます。これは非常にうまく機能することがわかり、bump_build_number.shスクリプトを作成してから変更する必要はありませんでした。
trojanfoe 2013

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はバージョン管理システムを使用しません。バージョン管理システムをApple Genericに設定すると、Xcodeがagvtoolで生成されたすべてのバージョン情報をプロジェクトに確実に含めるようになります。

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

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

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

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

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

7
これの問題は、agvtoolがxcodeビルドを中止するため、ビルドフェーズでスクリプトとして統合できないことです。
Daniel Schlaug、2016

1
スキームのビルドのプレアクションにagvtoolを介してバンプを配置できませんか?
lottadot

11

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

スニペットをコピーして、Xcodeのスクリプト実行ビルドフェーズに直接貼り付けるだけです。

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;

CFBundleVersionをインクリメントするにはどうすればよいですか?Xcode 5.1では、「1.0」のような形式の文字列ですか?
chrisp

1
最後に、正しく実行している人:)開発デバイスで実行するすべてのビルドを気にするのはなぜですか?リリース(およびテスターへのリリース)は、「うーん、その2pxを左に移動する」ビルドではなくカウントします。
uvesten 2015

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

そうですね。お役に立てて嬉しいです。それ以来、Xcode 4. {2,3,4,5}でまったく問題なく使用しています。
trojanfoe

私がこの答えを見たなら、私は数時間自分を救ったでしょう!また、ビルド番号には小数を含めないでください。そうしないと、BASHが機能しなくなります。
ブレンデン

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としても利用できます(少し簡単にコピーして貼り付けることができます)。


5

自動修正の使用をお勧めします。

Xcodeは、ビルド時にinfo.plistで展開される値を提供するヘッダーファイル(ビルド時に自動生成され、vcs自体では生成されない)を提供します。これを設定するためのチュートリアルは、autorevision Webサイトにあります。

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


1
Autorevision必要に応じて、ビルド番号をバンプしていないように見えますか?
trojanfoe 2013

新しいコミットでのみビルドすると仮定すると、VCS_NUM探しているものになるはずです(についてはautorevision.hを参照してください)。
dak180

Vienna-Info.plistVienna-All.xcconfigは、xcodeプロジェクトでこれを設定する方法の良い例です。
dak180

4

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

このPerlスクリプトは、現在のターゲットのInfo.plistsだけでなく、プロジェクト内のすべての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');
}

あなたが引用している投稿は、「事実上、LSは次の形式を想定しています:nnnnn [.nn [.nn]] [X]ここで、nは0〜9の数字、角括弧はオプションのコンポーネントを示し、Xは任意の文字列です数字で始まる。Xは存在しても無視されます。'-つまり、99999ビルドです。ほとんどのプロジェクトで十分なはずです。
ジェイ

@ジェイ私はどうやらそれを4桁と誤って読みました。おっとっと。(それでも、開発スタイルに多くの微調整と再構築が含まれている場合、プロジェクトで何年もの開発を行った後、100,000ビルドに到達できるとは考えられません。)
ブレントロイヤルゴードン

@ BrentRoyal-Gordon True-ビルドスクリプトを微調整して、リリース構成のビルドのみをインクリメントしました..10年以上のレガシー製品でも、1万ビルド近くに到達したことはないかもしれませんが、それは一種の良い感じです新しいCocoaプロジェクトを伴う大量のヘッドルーム;-)
Jay

4

Appleの一般的なバージョン管理を使用できます。基本的にagvtool next-version -allは、.xcprojファイルをホストするディレクトリ内から呼び出すだけです。詳細については、上記のURLを確認してください。


3
このソリューションの問題は、プロジェクトのスクリプト内からagvtoolを呼び出すと、ビルドがキャンセルされることです。これの回避策を見つけられない限り、これは良い解決策ではありません。
Dan Loewenherz

3

Wil Gieselerのソリューションに基づいて、私がしたい変更は1つだけありました。彼のソリューションは、ビルド番号にgit commitsの数を入れています。有用ですが、そのビルドを作成した実際のコミットを見つけるのはやや面倒です。ビルド番号が単調に増加しているかどうかはあまり気にしていなかったので、特定のバイナリを生成したコミットに簡単にアクセスできるように、その要件を削除しました。

そのために、私は彼の最初のスクリプトを次のように変更しました。

# Set the build number to the decimal conversion of the short version of the current git SHA

# Get the short version of the current git SHA in hexadecimal
SHA=$(git rev-parse --short @)
# Uppercase any alphabetic chars in SHA (bc doesn't like lowercase hex numbers)
UPPERCASE_SHA=$(tr '[:lower:]' '[:upper:]' <<< "$SHA")
# Use bc to convert the uppercase SHA from hex to decimal
BUILD_NUM=$(bc <<< "ibase=16;obase=A;$UPPERCASE_SHA")
# Set our build number to that
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUM" "${PROJECT_DIR}/${INFOPLIST_FILE}"

# To convert a build number back to a usable git SHA, run the following, substituting the build number for <build number>
# bc <<< "ibase=10;obase=16;<build number>"

これにより、現在のgit SHAの短いバージョンが10進数に変換されます。16進文字はAppleのビルド番号要件とうまく連動しないため、これを行わなければなりませんでした。元に戻すには、次のように実行するだけです。

SHA=$(bc <<< "ibase=10;obase=16;<build number>")

bashでは<build number>、バイナリから取得したビルド番号です。次に、を実行するだけで完了git checkout $SHAです。

これは、前述のようにWil Gieselerのソリューションを適応したものであるため、次のビルド後のスクリプトも必要です。

# Set the build number to "DEVELOPMENT"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"

gitの履歴をクリーンに保ちます。


それでは、git情報がに書き込まれInfo.plist、それ自体がgitによって追跡されるとしたら、それはどのように機能しますか?
trojanfoe 2015年

@trojanfoe回答の冒頭で述べたように、この回答はWil Gieselerのソリューションを応用したものです。そのため、そこで使用されるのと同じポストビルドスクリプトが必要です。それを明示的に回答に追加しました。
ravron 2015年

2

私は修正された手順を試してみましたが、それはうまくいきませんでした:-

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

  2. gitはProject-Info.plistの以前の変更に注意します

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

if [ -n "$(find $dir \! -path "*xcuserdata*" \! -path "*.git" -newer $plist)" ]; then

2

これを行うのは、アーカイブするとき(そしてたとえばTFにアップロードするときなど)だけです。そうしないと、バージョン番号がすぐに上がる可能性があります。

スキーマ(製品/スキーマの編集/アーカイブ/事前アクション)で、アーカイブするときにのみ実行されるスクリプトを追加できます。

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

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

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

ビルド番号はアーカイブしたときにのみ増加するので...

編集:私が言ったことを修正してください、アーカイブの前のアクションはビルド後(ただしアーカイブの前)に起こるので、次のアーカイブのためにビルド番号がインクリメントされます...しかし、新しいスキームを作成し、このアクションをビルドに追加することができます(プレ-アクション)この新しいスキームのセクション。新しいスキームを作成したい場合は、このスキームを使用します


1
うん、それは急速に上がっている(現時点では5500以上)が、それは私にとって問題ではない。それは単なる数字です。しかし、何かが機能する前にCmd-B / Cmd-Rが何回ヒットするかは
興味深い

2

ビルド番号には最新のSVNリビジョンを使用しています。ビルドディレクトリのInfo.plistを変更しても、ソースのInfo.plistには影響しません。

# use the last SVN revision as the build number:
Info_plist="$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Info.plist"
defaults write "${Info_plist}" CFBundleVersion `svn stat -u | awk '/'"Status against revision:"'/ {print $4}'`

2

自分の部族を見つけたような気がします。部族、VersionXを楽しんでくれたらいいのに。

10年前、25を超えるXcodeプロジェクトが含まれるワークスペースで作業しているときに、バージョンを自動化し、文字列の更新を構築する機会を利用しました。

バージョンX:

  • ビルドタイプを認識している(リリース/デバッグ)
  • ビルド時にリポジトリから情報を収集します(gitサポートが含まれていますが、hg、svn、または使用するものに合わせてカスタマイズできます)
  • 簡単にカスタマイズできるファンシーマーケティングバージョンの文字列(App Storeが規則を適用する前にはるかに多くのバリエーションがあった)が提供されるため、たとえば、gitタグの規則を使用して、「ベータ」のシンボルを含む文字列を自動的にインクリメントできます。
  • バージョン情報とコミット情報を含むインスタンス変数が入力されたクラスが含まれています。これは、Aboutパネルにデータを入力し、事前に入力された情報を使用してログ文字列、クラッシュレポート、またはユーザーの電子メールバグレポートを作成するのに役立ちます。

作るのが楽しかったです。Xcodeビルドシステムについてのボートロードを学びました。

以下は、VersionXが自動的に生成できる豪華なバージョンとビルド文字列のタイプの例です。

VersionX 1.0.1β7(c5959a3「クリーン」)

マーケティングバージョン: VersionX 1.0.1β7「1.0.1はコミットのタグから派生しますが、「ベータ7」はコミットカウントまたはビルドカウント(たとえば)によって自動的に生成されます。

ビルドバージョン:(c5959a3“ Clean”)短いコミットハッシュを表示し、ビルドディレクトリにコミットされていない変更がないことを通知します。

VersionX(GitHubのソース)-Xcodeプロジェクトでバージョンとビルド文字列を自動的にインクリメントするバロックシステム。

VersionXドキュメント。


1

Xcodebumpと呼ばれる、私が開発している新しいツールをチェックしてみてください。CFBundleShortVersionStringとCFBundleVersionの両方の更新を処理できます。最後のステップとして、gitにチェックインして、それらのCFBundle値と一致するようにコミットにタグを付けます。

Xcodebumpプロジェクトは次の場所にあります。

https://github.com/markeissler/Xcodebump


1

build number以下の方法で更新しています。

$INFO_FILEplistファイルのパスです。そして$build_number、この建物の新しいビルド番号です。

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build_number" "${INFO_FILE}"

一般的に、私の$build_number構成要素はmajorminorパーツです。これminorはプロジェクト情報からのものです。そこで、majorパーツの生成方法について説明します。

## Composed by `major` and `minor`. 
## `minor` is parsed from project information. It's another story.
## Examples: `21.1`, or `21.1.3`
build_number="${major_number}.${minor_number}"

私は決定する2つの戦略を持っています $build_numberます。

最初の戦略

この戦略は、使用してgit tag決定する数majorのをbuild number53プロジェクトのタグがあれば53、以下のシェルスクリプトで戻ります。

一般的に、それは増加しています。また、公開前に開発者にgitタグを付けるよう強制します。

major_number=$(git tag -l | wc -l | grep -oE "\d+")

第二の戦略

ましょうジェンキンス CIシステムが決めるmajor部分を。環境変数がありますBUILD_NUMBER。CIシステムで構築すると、自動的に増加します。この情報は、CIシステムのプロジェクト履歴を追跡するのに役立ちます。

major_number=${BUILD_NUMBER}

1

更新されたバージョンはこちらです。これは、Xcode 9.3.1、iOS 11以降で機能します。

アプリケーションターゲットから[ビルドフェーズ]をクリックし、+アイコンをクリックして新しい実行スクリプトを追加し、ボックスにこのコードを貼り付けます。

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}"

Info.plistファイルに移動して、「バンドルバージョン」を1に設定し、「バンドルバージョン文字列、短い」を1に設定する必要があります。

Info.plistを表示してプロジェクトをビルドすると、バンドルバージョン(ビルド番号)の変更が表示されます。

  • Xcode 9.3.1以降では、これらの変更は[全般]タブからは確認できませんが、ビルドをアーカイブするとき、およびInfo.plistで変更を確認できます。

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:majorrake increment:minor、またはrake increment:tinyいつでもしたいです。


0

agvtoolを使用してバージョンとビルド番号を自動化するのが最も便利だと思いますます。

これを試して:

  1. 上記のリンク先にあるAppleのドキュメントの説明に従って設定します。
  2. スクリプトを追加プレアクションとしてをプロジェクトに ->スキームを編集...->アーカイブ(または必要に応じてその他)
  3. セット:ビルド設定を提供 <your_app_target>

スクリプト(最初の行はオプションです):

exec > ${PROJECT_DIR}/prebuild.log 2>&1
cd ${PROJECT_DIR}
xcrun agvtool next-version -all
cd -

0

これをApple独自の方法で実行しましょう。ビルドが成功するたびにビルド番号が増加します

5つの画像をご案内します。

  1. Stop_build_buttonの右側にあるプロジェクト名を選択したら、ドロップダウンから[スキームの編集...]を選択します。 最初のステップを確認

  2. 左側のメニューから[ビルド]オプションを展開し、[ポストアクション]を選択します。2 番目のステップを確認します

  3. ここでは、プログラムのビルドが成功した後に実行したいコード(スクリプト)を追加できます。これは、自動化を完全に機能させるために少量のコードを追加する必要がある場所です。>> 1.「新しいスクリプトの実行アクション」を選択し、ドロップダウンから今2 >> 'を追加(+)の新しいスクリプトファイルを追加するには左側のコーナーからボタンを選択する 第三工程をチェック

  4. これには3つのフィールドがあります>> 1.シェルは既に割り当てられています>> 2.ここで「ビルド設定の提供元」にプロジェクト名を選択します。>> 3.スクリプトを追加する大きなフィールドがあります。このコードをコピーして貼り付けてください。4 番目のステップを確認してください

    PLIST = "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}" PLB = / usr / libexec / PlistBuddy LAST_NUMBER = $($ PLB -c "Print CFBundleVersion" "$ PLIST")NEW_VERSION = $(($ LAST_NUMBER + 1))$ PLB -c "セット:CFBundleVersion $ NEW_VERSION" "$ PLIST"

  5. 4番目のステップが完了したら、「閉じる」を選択してウィンドウを閉じます。最後のステップを実行する必要があります。プロジェクトファイルメニューの「plist.info」ファイルに移動し、「キー」セクションの「バンドルバージョン」キーが最も含まれていることを確認します。数値チェックの5番目のステップ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.