読者です 読者をやめる 読者になる 読者になる

チーム開発でのplistの管理方法

Xcode Cocoa Python

複数名のチームでCocoa/Cocoa Touchのアプリケーションを開発している状況で、誰かがplistの設定ファイルを間違ってコミットしたからアプリケーションが動かなくなったといった状況を防いだり、開発中は自分固有の設定を使いたいとする。

ぱっと思いついた方法。

以下のようなPythonスクリプト(仮にplistmerge.pyとする)を準備し、

#!/usr/bin/env python                                                                                                                                                
import sys                                                                                                                                                           
import plistlib                                                                                                                                                      
                                                                                                                                                                     
source_config = plistlib.readPlist(sys.argv[1])                                                                                                                      
user_config = plistlib.readPlist(sys.argv[2])                                                                                                                        
output_filename = sys.argv[3]                                                                                                                                        
                                                                                                                                                                     
source_config.update(user_config)                                                                                                                                    
plistlib.writePlist(source_config, output_filename)

Xcodeプロジェクトに次のような感じで配置する。

__PROJECT__
├── config
│     ├── config-master.plist
│     ├── config.plist
│     ├── plistmerge.py
│     └── user.d
│         └── config-$USER.plist
└── main.m

config-master.plistが元になる設定ファイルで、config/user.d以下にあるのが開発者毎の設定。config-$USER.plist のようにUnixユーザー名で各自設定ファイルを作り、上のplistmerge.pyを実行すると、config-master.plistをconfig-$USER.plistで値を上書きし、最終的に使いたいconfig.plistを生成してくれる。

Xcodeで新しいTargetを追加し、以下のようなスクリプトを実行するフェーズを追加しよう。

CONFIG_DIR=${SRCROOT}/${PROJECT_NAME}/config

SOURCE_CONFIG=${CONFIG_DIR}/config-master.plist
USER_CONFIG=${CONFIG_DIR}/user.d/config-${USER}.plist
OUTPUT_CONFIG=${CONFIG_DIR}/config.plist

if [ -f ${USER_CONFIG} ]
then
  ${CONFIG_DIR}/plistmerge.py ${SOURCE_CONFIG} ${USER_CONFIG} ${OUTPUT_CONFIG}
else
  cp ${SOURCE_CONFIG} ${OUTPUT_CONFIG}
fi

config/config.plist, config/user.d を svn:ignore や .gitignore を使ってレポジトリに入れないようにしておけば、不要なコミットでチームメンバーを混乱させることもない。

開発者ごとに独自の設定を持てるようにするというのは誰もが必要としていることだから、もっと簡単にできる方法がありそうなものだが、僕はとりあえずこれで満足した。

あと、標準ライブラリにplistlibが含まれているPythonは素晴らしいですね。さすがにMac/iOSアプリ自体の実装はCocoaでやった方がよいと思うけど、それ以外のことは全てPythonでやるべきですね。