NOTE: ビルド番号を自動で増やす

iOS/Macアプリを作る時にビルド番号の更新し忘れを防ぐ方法のメモ。

サンプルコードはここ VersionUp.zip

目的

  • ビルド番号の更新し忘れを防ぐ

  • ビルド番号でcommit漏れでビルドした物を区別できるようにする

  • マーケティングバージョン番号やコピーライトの変更は1箇所で行い更新漏れを防ぐ

設計の基本方針

  • 更新時に編集するファイル数は最小限にする

  • 出来るだけXCodeの機能を使い外部ツールの使用は最小限にする

  • ビルド番号はgitのcommit数を使う

  • ビルド番号を記述したファイルはgitに追跡させない

実装

上記の基本方針を実装するには以下の2つの手法を使うことで可能

  • configファイルを読み込ませてinfo.plsitの値を指定する

  • pre-actionから外部scriptを呼び出し上記のconfigファイルを更新する

関連ファイルは以下の5つ

関連ファイル

ファイル名

用途

VersionUp.xcodeproj

サンプル用のプロジェクト

make_buildNumber_xcconfig.sh

buildNumber.xcconfigにビルド番号を書く

Config.xcconfig

buildNumber.xcconfigを読み込んだり

buildNumber.xcconfig

このファイルにbuild番号をシェルスクリプトから書き込む

.gitignore

buildNumber.xcconfigをgitに追跡させない設定を行う

Config.xcconfigとbuildNumber.xcconfigが分かれているのはgitで追跡させる部分と追跡させない部分を分けるためです。 また、分けることでmake_buildNumber_xcconfig.shのコードをシンプルにしています。

Build時の呼び出し順序

../../../_images/buildSec.png

関連するinfo.plstの設定キーは以下の通り

関連info.plstキー

キー文字列

用途

CFBundleShortVersionString

マーケティングバージョン番号

CFBundleVersion

ビルド番号

NSHumanReadableCopyright

コピーライト文字列

上記のキーで指定された文字列は about panel の以下の部分に反映されます。

../../../_images/aboutPanel.png
about panelの対応

キー文字列

文字列

CFBundleShortVersionString

3.2.1

CFBundleVersion

1M

NSHumanReadableCopyright

Copyright 2025 mindto01s. All right reserved.

configファイルで設定している変数

名前は適当に決めてます。それぞれのお仕事で使える接頭語なり接尾語を追加してユニークにしてください。

about panelの対応

変数名

目的

MTL_MARKETING_VERSION_NUMBER

マーケティングバージョン番号にしたい文字列

MTL_BUILD_VERSION_NUMBER

ビルド番号にしたい文字列

MTL_COPYRIGHT_STRING

コピーライトにしたい文字列

make_buildNumber_xcconfig.shの説明

ビルド番号を生成するためのスクリプトです。 commitしていないファイルがあると番号の末尾に"M"がつきます。

#!/bin/sh

# make_buildNumber_xcconfig.sh
#
#
# Created by narita on 07/05/15.
# Copyright 2007 __MyCompanyName__. All rights reserved.
#
# カレントディレクトリ上にgitのリビジョン数の値を示すファイルbuildNumber.xcconfigを作成する
#
# 勿論、ファイルbuildNumber.xcconfigはgitには管理させないのでignoreしておく
# 元ネタは以下のコードを改変しました
# http://www.zathras.de/angelweb/x2005-04-18.htm

# リビジョン総数を出す
git_rev_num=`git rev-list HEAD | wc -l | tr -d ' '`

# ローカルで変更されているかの判定
git_modified_line_count=`git status -s | wc -l | tr -d ' '`
if [ $git_modified_line_count != 0 ] ; then
    git_modified_flag='M'
else
    git_modified_flag=''
fi


# リビジョン番号とローカルでの変更フラグを合体させてビルド番号文字列を作る
# 末尾に'M'がついている場合はローカルにcommitされていない変更がある目印になる
git_rev_num_string=$git_rev_num$git_modified_flag

if [ -f ./buildNumber.xcconfig ] ; then
    file_rev_num_string=`grep -e MTL_BUILD_VERSION_NUMBER ./buildNumber.xcconfig | cut -f '3' -d ' '`
else
    file_rev_num_string='DUMMY_STRING'
fi

# ファイルが無いか、バージョン番号が異なるならばファイルを生成する
if [ $file_rev_num_string != $git_rev_num_string ] ; then
    # Now write the constant declaration to the file:
    echo "MTL_BUILD_VERSION_NUMBER = $git_rev_num_string" > buildNumber.xcconfig
fi

exit 0

詳細はコメントを読んでほしい。

Config.xcconfigの説明

このファイルを書き換えることで出荷ごとのマーケティング番号や出荷年ごとのコピーライトを変更します。 xcodeのプロジェクトファイルの中に置かないことでgitとの相性やdiffコマンドとの相性をよくしています。

このファイルは c preprocessor のように include 文が使えるのでここでビルド番号が記述されているファイルを読み込んでいます。

//
//  Config.xcconfig
//
//  Created by narita on 2025/01/21.
//

// CFBundleShortVersionStringに$(MTL_MARKETING_VERSION_NUMBER)を設定する
MTL_MARKETING_VERSION_NUMBER = 3.2.1

// CFBundleVersionに$(MTL_BUILD_VERSION_NUMBER)を設定する
// MTL_BUILD_VERSION_NUMBERを読み込む
#include "buildNumber.xcconfig"

// NSHumanReadableCopyrightに$(MTL_COPYRIGHT_STRING)を設定する
MTL_COPYRIGHT_STRING = Copyright 2025 mindto01s. All rights reserved.

VersionUp.xcodeprojの設定箇所

XCodeのプロジェクトファイルの設定箇所です。文字で表すと分かりにくいのでスクリーンショットを多用しています。

なお私がこのノートを取る目的はこの設定方法を毎回忘れてしまうからです。

スキームの設定箇所

場所が分かりにくいが、以下の手順でモーダルダイアログを出す。

Product ‣ Scheme ‣ Edit Scheme...

モーダルダイアログが出たら以下の手順で script actionを設定する。

Build ‣ pre-actions ‣ + ‣ New run script action

コードは以下の2行で外部のスクリプトを呼んでいる。

cd "$SRCROOT"
sh make_buildNumber_xcconfig.sh
../../../_images/schemePanel.png

configの読み込みの設定箇所

さらに分かりにくいが、やってることは以下の2点

  1. ファイルconfig.xcconfigをプロジェクトファイルに登録

  2. プロジェクトの基本的なconfigとしてconfig.xcconfigを設定する

config.xcconfigの登録はDrag&Dropで問題なし。

分かりにくいには、(b)の設定。

PROJECT VersionUp ‣ info ‣ DebugPROJECT VersionUp ‣ info ‣ Relese の2つにconfig.xcconfigを設定する。 赤いアンダーバーの箇所を参考にして設定してください。

../../../_images/infoConfig.png

Build settingの設定箇所

これは少し分かりにくいが普段XCodeで開発している人ならば説明は不要だと思います。

スクリーションショットの赤いアンダーバーの箇所を参考にして設定してください。

Project Build settingの設定箇所

config.xcconfigから読み込まれる値を設定するように build setting に書き込む。

../../../_images/MTL_copyright.png ../../../_images/MTL_BuildVersion.png ../../../_images/MTL_marketingVersion.png

Target Build settingの設定を削除する場所

設定上書きされないように以下の3箇所の設定を削除してください。

  • copyright

  • current project version

  • Marketing version

それぞれの場所は以下のスクショを参考にしてください。

../../../_images/delCopyright.png ../../../_images/delVersion.png

buildNumber.xcconfigの説明

スクリプトmake_buildNumber_xcconfig.shが作成します。

中身は以下のようになってます。

MTL_BUILD_VERSION_NUMBER = 1M

1Mの部分はcommit数によって変わります。末尾のMはローカルにcommitされていないファイルがあると追加されます。 昔svnversionコマンドで便利だったのでデバッグ時のミスを防ぐためにつけました。

.gitignoreの説明

buildNumber.xcconfigをgitに追跡されないようにしてます。

buildNumber.xcconfig

Comments

comments powered by Disqus