Yii 2.0.x で Composer Asset Plugin を使わないでアプリを作っていく方法

## はじめに

Yii 2.0.x でウェブアプリを開発していく場合、最初に Composer Asset Plugin をグローバルにインストールする必要がある。これは Composer 経由で Bower や npm のパッケージをインストールするもので、Node.js を用意しなくてもいいし、パッケージの依存関係をすべて Composer で管理できるので大変便利だが、とにかく遅い。

Yii の 2.1 系ではおそらくオプション扱いになる流れはあるものの、まだ少し先になるだろうから、その前に Composer Asset Plugin を使わずアプリを開発できないかいろいろ調べてみた結果を記事にする。

## 準備しておくもの

* Node.js
* Bower

## やり方

まず Composer のグローバルにインストールされているパッケージ一覧を表示:

```
composer global show -i
```

fxp/composer-asset-plugin が存在するならそれを削除:
( 他のプロジェクトにも影響する場合は、個別に開発環境を作ってそこで試してみるといいかも )

```
composer global remove fxp/composer-asset-plugin
```

この状態で Yii のプロジェクトのテンプレートを作成:
( パッケージのインストールはまだしない )

```
cd /path/to/somewhere
composer create-project --no-install --prefer-dist yiisoft/yii2-app-basic basic
cd basic
```

ここで、パッケージのインストールのテストをする:

```
composer update --dry-run
```

おそらくエラーメッセージが出るので、その中から bower-asset/xxx 部分を抜き出して composer.json の provide 項目に追加していく:
( エラーが出なくなるまで数回、インストールのテストと provide 項目への追加を繰り返す )

```json:composer.json
{
   "provide": {
      "bower-asset/jquery": "*",
      "bower-asset/jquery.inputmask": "*",
      "bower-asset/punycode": "*",
      "bower-asset/yii2-pjax": "*",
      "bower-asset/bootstrap": "*",
      "bower-asset/typeahead.js": "*"
    },
```

パッケージのインストールが正常にできるのを確認できたら composer.json の scripts 項目の post-create-project-cmd を post-update-cmd に書き換える。

```json:composer.json
{
  "scripts": {
    "post-update-cmd": [
      "yii\\composer\\Installer::postCreateProject"
    ]
  },
```

この状態で、パッケージのインストールをする:

```
composer update
```

これで bower-asset 関連のパッケージを除いたものがインストールされる。インストール後は composer.json の必要のない項目は削除して、一応再度アップデートをかけておく:

```json:composer.json
{
  "require": {
    "yiisoft/yii2": "~2.0.5",
      "yiisoft/yii2-bootstrap": "~2.0.0",
      "yiisoft/yii2-swiftmailer": "~2.0.0"
  },
    "require-dev": {
      "yiisoft/yii2-codeception": "~2.0.0",
      "yiisoft/yii2-debug": "~2.0.0",
      "yiisoft/yii2-gii": "~2.0.0",
      "yiisoft/yii2-faker": "~2.0.0"
    },
    "provide": {
      "bower-asset/jquery": "*",
      "bower-asset/jquery.inputmask": "*",
      "bower-asset/punycode": "*",
      "bower-asset/yii2-pjax": "*",
      "bower-asset/bootstrap": "*",
      "bower-asset/typeahead.js": "*"
    }
}
```

```
composer update
```

次に bower 経由でアセット関連のパッケージをインストールする方法。

bower.json の作成:

```
touch bower.json
```

```json:bower.json
{
  "name": "basic"
}
```

`composer show -t` でインストールされたパッケージの依存関係一覧がツリーで表示できるので、その中から bower-asset の行を抽出して、その各項目を bower でインストールする:


```
composer show -t | grep -o "bower-asset.*" | sort | uniq
bower i -S bootstrap#~3.3.0 jquery#~2.1.0 jquery.inputmask#~3.1.0 punycode#~1.3.0 typeahead.js#~0.10.0 yii2-pjax#~2.0.1
```

これで完了です :)

## ウィジェット系のエクステンションを追加する場合

`composer require` などでエクステンションを追加する場合、bower 系のアセットが含まれていればエラーを吐いてしまうので、その都度、エラー部分の bower-asset/xxx を composer.json の provide 項目に追加してパッケージをインストールし、アセット部分は bower でインストールすることになる。

## その他の注意点など

bower の各パッケージは自分でバージョンを指定することになるので、Composer 側のバージョンと合わせておく必要がある。

## まとめ

アセット関連のパッケージが大量にある、といったプロジェクトだとけっこう面倒くさいし管理も少し注意しないといけないが、REST API やちょっとしたコンソールアプリケーションを Yii 2.0.x で作りたい場合や、とにかく遅い Composer の install|update を速くしたいといった場合などでは、一応の対処方法として、やってみる価値はあると思う。

ていうか Yii 2.1 系のリリースが待ち遠しい ... 。

## リンク

- [Yii Forum: Do I need to install fxp/composer-asset-plugin if I'm not doing front-end development](http://www.yiiframework.com/forum/index.php/topic/68361-do-i-need-to-install-fxpcomposer-asset-plugin-if-im-not-doing-front-end-development/)
- [GitHub: yiisoft-contrib/github-bot](https://github.com/yiisoft-contrib/github-bot)
- [yii2をcomposer-asset-pluginから自由にする](http://qiita.com/kitatuba/items/ebd2a2a92d0756bd4969)
- [Qiita: composer 導入をまじめに考える](http://qiita.com/notona/items/c5a087d8dd446d315e6e)
- [GitHub: hirak/prestissimo](https://github.com/hirak/prestissimo)