#動機
- Cordovaのconfig.xmlのversionは手で書き換える必要がありめんどくさい&更新をよく忘れる(でGoogle Playのアップロード時とかに怒られる)
- 一方package.jsonのversionはCLI(
npm version
)で更新できる上、major/minor/patchの指定で自動的に採番してくれたりgitのtagを作ってくれたりと便利
というわけでnpm version
で一緒にconfig.xmlも更新できたらいいなと思って調べてみました。
#調べたこと
##npm側
scripts | npm Documentation
npmには様々なタイミングでpackage.jsonのscriptsに書かれたコマンドを実行する機能があります。
npm version
ではpreversion, version, postversionが実行されるようになっているので、ここに何かしらを書けばできそうな気がします。
これらの実行タイミングについては以下の記事が参考になりました。
npm version, preversion, postversionの使い分け
preversion → package.json更新 → version → コミット&タグ → postversionという流れのようなので、更新されたバージョン番号を使って別のファイルを更新または生成し、package.jsonと一緒にコミットしたいという場合はversionに書くのが適当なようです。
##Cordova側
version更新のためにconfig.xmlをいじる必要があるのですが、そんなときに便利なのがconfig.xmlの値を取得したり設定したりといったことができるcordova-commonパッケージのConfigParser
。
プラグインのフック(インストール後にconfig.xmlに設定を加えたりとか)などで使われているようです。
setVersion()
という見事に今回の需要にマッチしたメソッドもあるので今回はこれを使用することにします。
#やってみる
実行した環境は以下の通り
- node.js v6.5.0
- npm v3.10.7
- cordova v6.5.0
##必要なものをインストール
$ npm i -D cordova-common
##config.xml更新スクリプト
var path = require('path');
var ConfigParser = require('cordova-common').ConfigParser;
var configXml = new ConfigParser(path.resolve(__dirname, '../config.xml'));
var packageJson = require(path.resolve(__dirname, '../package.json'));
configXml.setVersion(packageJson.version);
configXml.write(); // 上書き保存。setVersionだけではファイルは更新されない
config.xmlやpackage.jsonへのパスは置き場所に応じて適宜調整してください。
##npm-scripts
{
"scripts": {
"version": "node scripts/update_config_xml_version.js && git add config.xml"
}
}
スクリプト中でGit管理対象のファイルの更新/追加が行われる場合はgit add
をお忘れなく。
##実行
$ npm version major
v1.0.0
> project@1.0.0 version /path/to/project
> node scripts/update_config_xml_version.js && git add config.xml
$ cat config.xml | sed '2!d'
<widget id="com.example.project" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
できた!