メモログ

塵が積もって山とならないメモのログ

gruntからXcodeプロジェクトのDeployment infoを変更する

gruntからXcodeプロジェクトのDeployment infoを変更する。Xcodeから変更するのは簡単。でもそれをgruntでtaskとして実行する。こうした作業をgrunt taskで行うメリットは、繰り返し行う作業の場合は、それを自動化できるという点。

AppName.xcodeprojのパッケージの中には、project.pbxprojというファイルがあって、ここにXcodeのプロジェクト関連の設定が入っています。node-xcodeというスクリプトはこのproject.pbxprojの内容をパースして、内容を更新保存させることができます。全体のスクリプトはGistに(ローカルタスクとして動くようになっている)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var xcode = require('xcode');
var _ = require('lodash') || grunt.util._;
var fs = require('fs');

var path = this.data.src;
var project = xcode.project(path);
var cb = this.async();

project.parse(function (err) {
if (err) {
grunt.log.write(err);
}

var XCBuildConfigurationSections = project.pbxXCBuildConfigurationSection();
_.forEach(XCBuildConfigurationSections, function (section) {
if (section.buildSettings) {
var bs = section.buildSettings;
bs['IPHONEOS_DEPLOYMENT_TARGET'] = '6.0';
bs['TARGETED_DEVICE_FAMILY'] = '1';
}
});

fs.writeFileSync(path, project.writeSync(), 'utf-8');
cb();
});

プロジェクトのパースは、xcode.project(path)でproject.pbxprojを指定して、そのあとproject.parse()を実行するだけです。引数にfunctionを渡すと、パース実行後にproject内容の操作ができます。

project.pbxXCBuildConfigurationSection()では、project.pbxproj内のisa=XCBuildConfigurationになっている設定が配列で返ってきます(通常「Release」と「Debug」が、プロジェクトとビルドごとに一つずつで計4つくるはず)。

設定本体は「buildSettings」というオブジェクトに含まれています。Deployment targetの設定は「IPHONEOS_DEPLOYMENT_TARGET」という名前で入っているので、そのkeyの値を変更する。「Devices」の設定は「TARGETED_DEVICE_FAMILY」。このあたりの名前はproject.pbxprojをテキストエディタで開いてみると、だいたいわかります。

それで内容の操作をしたあとに、fs.writeFileSync(path, project.writeSync(), ‘utf-8’);をして、内容を上書きして終了します。最後のcb()は、Gruntタスク内のthis.asyncを実行して、タスクが完了させています。

という(雑すぎてあとで自分で思い出せるのか不安な)メモ。