Xcodeビルドプロセスの一部としてシェルスクリプトを使用してplistファイル内のビルド番号を増やしていますが、Xcode 4.2.1が頻繁にクラッシュします(エラーが発生します)プロジェクトに属していないターゲット;plistファイルの変更がXcodeを何らかの方法で混乱させていると推測しています。
ファイルがplistファイルよりも新しいときにビルド番号がagvtool
だけ増加するように、シェルスクリプトはこれを行いました(したがって、ビルドは値を増加しませんでした) ):
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スクリプトを使用して、この種のことをしています 。十分に文書化されていませんが、解決するのは難しくありません。おまけとして、このリポジトリには、サードパーティライブラリをアプリバンドルに自動的にバンドルする便利なスクリプトも含まれています。
あなたの質問を正しく理解したら、Xcodeの標準プロジェクトテンプレートの一部であるProject-Info.plist
ファイルを変更しますか?
私がこれを尋ねる理由は、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
の設定を調べることもできます。
私はこの質問に関する多くの答えをいじりましたが、どれも私を満足させませんでした。しかし、最終的に私は本当に好きな混合物を思いつきました!
ビルドフェーズの最初と最後の2つのステップがあります。
最初に:
# Set the build number to the count of Git commits
buildNumber=$(git rev-list HEAD | wc -l | tr -d ' ')
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
最後に:
# Set the build number to "DEVELOPMENT"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"
XcodeのInfo.plistを見ると、バージョン番号が「DEVELOPMENT」であることがわかりますが、ビルドされたアプリのビルド番号は常に増加しています。 (常に同じブランチからビルドを行う限り。)
最後にバージョン番号を定数文字列に戻すと、アプリをビルドしてInfo.plistファイルを変更できなくなります。
この方法が好きな理由:
私はこのglistを使用してきましたが、期待どおりに動作します。 https://Gist.github.com/sekati/3172554 (すべてのクレジットは元の著者に送られます)
時間の経過とともに修正したSctipts。
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 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)
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}"
このエントリ全体が非常に役に立ちました。このトリックを使用しましたが、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
どの方法が最善かはわかりませんが、だれかがそれを探している場合に備えて、Appleの答えを投稿します...
これによると AppleのQ&A投稿 :
バージョンキーとビルド番号キーは、それぞれアプリケーションのマーケティングバージョンと内部バージョンを指定します。 agvtoolは、これらの番号を次に大きい番号または特定の番号に自動的に増分できるコマンドラインツールです。
ビルド番号は、アプリケーションの未リリースまたはリリース済みバージョンを識別します。アプリケーションのInfo.plistにCFBundleVersion
(バンドルバージョン)として保存されます。
Xcodeプロジェクトで次の手順を完了する必要があります。
ターゲットのビルド設定ペインに移動し、次のようにすべてのビルド構成用にそれを更新します。
Xcodeプロジェクトデータファイルproject.pbxprojには、プロジェクトの現在のバージョンを指定するCURRENT_PROJECT_VERSION
(現在のプロジェクトバージョン)ビルド設定が含まれています。 agvtoolは、project.pbxprojでCURRENT_PROJECT_VERSION
を検索します。 CURRENT_PROJECT_VERSION
が存在する場合は実行を継続し、そうでない場合は実行を停止します。その値は、ビルド番号を更新するために使用されます。
デフォルトでは、Xcodeはバージョン管理システムを使用しません。バージョン管理システムをApple Genericに設定すると、Xcodeがagvtoolで生成されたすべてのバージョン情報をプロジェクトに含めるようにします。
agvtoolは、アプリケーションのInfo.plistでバージョンとビルド番号を検索します。存在する場合は更新し、それ以外の場合は何もしません。次の図に示すように、Info.plistにCFBundleVersion
(バンドルバージョン)キーとCFBundleShortVersionString
(バンドルバージョン文字列、短い)キーが存在することを確認してください。
Xcodeを終了し、ターミナルアプリケーションで.xcodeprojプロジェクトファイルを含むディレクトリに移動してから、次のコマンドを実行します。 .xcodeprojプロジェクトファイルには、agvtoolで使用されるproject.pbxprojが含まれています。 (これは、コマンドラインの代わりにスクリプトで実行できる部分です。)
バージョン番号の更新
バージョン番号を特定のバージョンに更新するには、次を実行します
xcrun agvtool new-marketing-version <your_specific_version>
Ex:バージョン番号を2.0に更新
xcrun agvtool new-marketing-version 2.0
ビルド番号の更新
ビルド番号を自動的にインクリメントするには、次を実行します
xcrun agvtool next-version -all
アプリケーションのビルド番号を特定のバージョンに設定するには、次を実行します
xcrun agvtool new-version -all <your_specific_version>
Ex:ビルド番号を2.6.9に設定します
xcrun agvtool new-version -all 2.6.9
ボーナス:
現在のバージョン番号を表示するには、次を実行します
xcrun agvtool what-marketing-version
現在のビルド番号を表示するには、次を実行します
xcrun agvtool what-version
FWIW-これは現在、ビルド番号を増やすために使用しているものですリリースビルドのみ(アーカイブを含む)。 Xcode 5.1で正常に動作します。
スニペットをRun scriptビルドフェーズに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;
スクリプトをありがとう。うまくいきます。
Info.plistはスペースを含む名前のサブディレクトリにあるため、plistパスを引用符で囲んでRun Scriptを変更する必要がありました。
${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
現在使用しているスクリプトは、上記の Alix's に非常に基づいています。以下の私の適応は、リリース/アーカイブビルドでのみ自動インクリメントを行うためのチェックを追加します。
その変更がないと、各開発者が独自のレートでビルド番号をインクリメントするため、バージョン管理の競合が発生します。そして、ビルド番号が常に変化するため、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 としても利用できます(コピーと貼り付けがやや簡単です)。
autorevision の使用をお勧めします。
Xcodeでは、ビルド時にinfo.plistで展開される値を提供するために、ヘッダーファイル(vcsではなく、ビルド時に自動生成できる)を使用できます。これを設定するためのウォークスルーは autorevision website にあります。
Autorevisionには、これらのタイプヘッダーファイルを対象とした出力タイプがあり、まさにこのような状況に役立ちます。
これらのソリューションのいくつかの問題の1つは、 Launch Servicesが認識するのは 四 バンドルバージョンの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');
}
Appleの汎用バージョン管理 を使用できます。基本的には、.xcprojファイルをホストするディレクトリ内からagvtool next-version -all
を呼び出すだけです。詳細については、上記のURLをご覧ください。
Wil Gieselerのソリューション に基づいて、変更したい変更が1つだけありました。彼のソリューションは、gitコミットの数をビルド番号に入れます。有用ですが、それでもそのビルドを作成した実際のコミットを見つけるのに苦労します。ビルド番号が単調に増加するかどうかはあまり気にしなかったので、特定のバイナリを生成したコミットにもっと簡単にアクセスできるように、その要件を下げました。
そのため、最初のスクリプトを次のように変更しました。
# 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履歴がクリーンになります。
部族を見つけたような気がします。部族、VersionXに面白がってほしい。
10年前、25を超えるXcodeプロジェクトが含まれるワークスペースで作業しているときに、時々更新するプロジェクトを1つまたは2つしか管理していない場合、バージョンを自動化し、不合理に思える程度に文字列の更新を構築する機会を得ました。
VersionX:
作るのは楽しかったです。私は、Xcodeビルドシステムについて多くのことを学びました。
以下は、VersionXが自動的に生成することができる派手なバージョンとビルド文字列のタイプの例です。
VersionX 1.0.1β7(c5959a3「クリーン」)
マーケティングバージョン:VersionX 1.0.1β7「1.0.1はコミットのタグから派生し、「ベータ7」はコミット数、またはビルド数(例)。
ビルドバージョン:(c5959a3“ Clean”)短いコミットハッシュを表示し、ビルドディレクトリにコミットされていない変更がないことを通知します。
VersionX(GitHubのソース)-Xcodeプロジェクトのバージョンとビルド文字列を自動的にインクリメントするためのバロックシステム
archiveの場合にのみこれを実行できます(たとえば、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
ビルド番号はarchive ...の場合にのみインクリメントされるため.
編集:私が言ったことを修正し、アーカイブの事前アクションはビルド後に(ただしアーカイブの前に)発生するため、次のアーカイブのためにビルド番号が増分されます...しかし、新しいスキームを作成してビルドにこのアクションを追加することができますアクション)この新しいスキームのセクション。新しいビルドを作成するときにこのスキームを使用します
変更された手順を試してみましたが、うまくいきませんでした。
Xcode 4.2.1は、.xcodeprojのxcuserdataサブディレクトリを変更します
gitはProject-Info.plistの以前の変更を記録します
次の変更により、これらは無視され、本物の変更のみにフラグが付けられます。
if [ -n "$(find $dir \! -path "*xcuserdata*" \! -path "*.git" -newer $plist)" ]; then
ビルド番号には最新の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}'`
次の方法でbuild number
を更新します。
$INFO_FILE
は、plistファイルのパスです。 $build_number
は、この建物の新しいビルド番号です。
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build_number" "${INFO_FILE}"
一般的に、私の$build_number
はmajor
とminor
の部分で構成されています。 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}"
$build_number
を決定する2つの戦略があります。
この戦略は、git tag
カウントを使用して、build number
のmajor
を決定します。プロジェクトの53
タグがある場合、次のシェルスクリプトによって53
を返します。
一般的に、増加しています。また、公開前に開発者にgitタグを配置するよう強制します。
major_number=$(git tag -l | wc -l | grep -oE "\d+")
Jenkins CIシステムがmajor
部分を決定するようにします。環境変数BUILD_NUMBER
があります。 CIシステムで構築すると、自動的に増加します。この情報は、CIシステムのプロジェクト履歴を追跡するのに役立ちます。
major_number=${BUILD_NUMBER}
Xcodebumpと呼ばれる、私が開発している新しいツールをチェックしてみてください。 CFBundleShortVersionStringとCFBundleVersionの両方の更新を処理できます。最後のステップとして、gitにチェックインし、それらのCFBundle値と一致するようにコミットにタグを付けます。
Xcodebumpプロジェクト は次の場所にあります。
更新されたバージョンです。これは、iOS 11のXcode 9.3.1で機能します。
アプリケーションターゲットの[ビルドフェーズ]をクリックし、[+]アイコンをクリックして新しい実行スクリプトを追加し、ボックスにこのコードを貼り付けます。
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ファイルに移動し、「Bundle version」を1に設定し、「Bundle versions string、short」を1に設定する必要があります。
Info.plistを表示してプロジェクトをビルドすると、バンドルバージョン(ビルド番号)が変更されます。
agvtoolを使用したバージョンとビルド番号の自動化 を使用するのが最も便利です。
これを試して:
<your_app_target>
からビルド設定を提供しますスクリプト(最初の行はオプションです):
exec > ${PROJECT_DIR}/prebuild.log 2>&1
cd ${PROJECT_DIR}
xcrun agvtool next-version -all
cd -
これが私の解決策です。あなたが私のような場合:セマンティックバージョニングのような、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
いつでも好きなときに。