IonicとCordovaのバージョンについて整理してみる

ここ最近はIonicを使ったハイブリッドアプリを開発してました(個人でなく、会社でのプロジェクトです)。

さて、こちらの記事の通り、Cordova Android脆弱性が見つかり、修正版がリリースされました。

IonicではCordovaのAPIを利用してネイティブの機能を使うので、今のプロジェクトでも「脆弱性の影響ないかな?」「そもそも、今のCordovaのバージョンなんだっけ?」と思ったのですが、調べていく過程で色々と混乱してしまっていたので、整理がてらまとめておきます。

Cordova iOS, Cordova Androidのバージョンを調べる

最初に結論なんですが、Ionic(Cordova)プロジェクト内のCordovaのバージョンを調べたい場合、プロジェクトの直下で

# cordova platform list

とすればよいです(Ionicの場合はionic platform listでもOKですね)。

サンプル出力は以下。

Installed platforms: android 4.0.2, ios 3.8.0
Available platforms: amazon-fireos, blackberry10, browser, firefoxos

Cordova Androidが4.0.2、Cordova iOSが3.8.0であることが分かります。

紛らわしいなーと感じた点は、あるハイブリッドアプリについて、以下のバージョンがどれも違うところです(カッコ内は手元の環境におけるバージョンです)

そのため、本エントリにおける以下の説明ではこれらは使い分けていきます。

ionicとionic-cliのバージョンは別物

バージョンを調べたい時は、慣れで

# ionic --version

としてしまいますが、ここで返ってくる結果はionicではなく、ionic-cliのバージョンです。
手元の環境だと1.4.5という結果が返ってきますが、Ionic自体はつい先日1.0がリリースされたばかりなので、Ionicが1.4.5というのはおかしいですしね。

ionicの諸々のバージョンを調べたい場合は、

# ionic info

とすると、以下のような結果が返ります。

Your system information:

Cordova CLI: 5.0.0
Ionic Version: 1.0.0
Ionic CLI Version: 1.4.5
Ionic App Lib Version: 0.0.22
ios-deploy version: Not installed
ios-sim version: Not installed
OS: Mac OS X Mavericks
Node Version: v0.12.4
Xcode version: Xcode 6.2 Build version 6C131e

通常、Ionicはグローバルにインストール( npm install -g ionic )すると思いますが、これでインストールされるのは、正確にはionicではなくionic-cliのようです。

ionic-cliはその名の通りコマンドラインツールであり、ionic-cliにおけるモジュールの依存関係的には ionic-cli -> ionic-app-lib -> cordova-lib となっていて、ionicには依存しません。
ionic-app-libはプロジェクトのジェネレータ、cordova-libはCordovaモジュールです。
というわけで、ionicとionic-cliは直接の依存関係はないし、cordova-libとCordova iOS/Cordova Androidにも直接の依存関係はない、ようです。

じゃあ、Ionicのバージョンはいつ、どこで決まってるのか?

…という疑問が湧いてきたので調べました。

どうやら、ionic startを実行する時(=プロジェクトを作成する時)に決まり、{PROJECT_ROOT}/www/lib/ionic/version.json で定義されるようです*1

流れとして、Ionicプロジェクトを作る場合、ionic start コマンドで雛形を生成することが多いと思いますが、プロジェクトのテンプレートに依らず、基底の雛形である ionic-app-baseというのがいて、その中でIonicのバージョンが指定されています。

つまり、ionic-cliをバージョンアップしなくても、ionic start を実行した時点で最新のIonicに基づくプロジェクト雛形が生成される、ようです(試してないので確証はないですが…)

なお、既存のプロジェクトのIonicをバージョンアップしたい場合は、プロジェクトで

# ionic lib update

とします。この辺りを知っておけば、プロジェクト作成後もionicのバージョンを自分達で管理することができます。

Cordova iOS, Cordova Androidのインストール

各プラットフォーム(Cordova iOS, Cordova Android)は、

# cordova platform add ios
# cordova platform add android

を実行することで、 platforms の下に ios, android ディレクトリが作られ、インストールされます。

プロジェクトのプラットフォーム情報は、package.json および platforms/platforms.json に書き込まれます。

package.json では以下のようにインストールされているプラットフォームが列挙されています(抜粋)。

"cordovaPlatforms": [
  "ios",
  "android"
 ]

platforms/platforms.json には以下のように、プラットフォームとバージョンが記載されています。

{
    "ios" : "3.8.0",
    "android" : "4.0.0"
}

自分達の環境では、IonicプロジェクトをGitでバージョン管理しているのですが、platforms 以下はダウンロードされている依存ライブラリということで .gitignore してます。
インストールするためには

# ionic state restore

とすると、package.json の中身を見てプラットフォームやプラグインをよしなにインストールしてくれます。

バージョンを指定してCordova iOS, Cordova Androidをインストール

2015.5.30時点で、 ionic platform add android を実行しても、Cordova Androidのバージョンとして(リリースされたばかりの)4.0.2ではなく4.0.0がインストールされていまいました…。

そこで、4.0.2をインストールするべく、明示的にバージョンを指定してインストールします。
なお、すでにプラットフォームがインストールされている場合は、一度削除してから追加した方が無難です。

# ionic platform rm android
# ionic platform add android@4.0.2

これでめでたくCordova Android 4.0.2が入りました。package.json

"cordovaPlatforms": [
  "ios",
  {
    "platform": "android",
    "version": "4.0.2",
    "locator": "android@4.0.2"
  }
]

となります(抜粋)。

まとめ

用途 コマンド
ionic, ionic-cli, etcのバージョン確認*2 ionic info
Cordovaのバージョン確認 ionic platform list
ionicのバージョンアップ ionic lib update
Cordovaのバージョンアップ ionic platform rm {ios|android} (インストール済の場合のみ)
ionic platform add {ios|android}@{version}

*1:version.json自体は単なるJSONファイルであり、プロジェクトにおけるIonic本体は、{PROJECT_ROOT}/www/lib/ionic 以下に配置されています。

*2:Ionicプロジェクト以外のディレクトリで実行すると、ionicのバージョンは表示されません。グローバルにインストールされているionic-cli等のバージョンだけが確認できます。