Composer で Drupal 7/8 サイトのコードを管理する　その１

## Composer について：

Composer とは、PHP の世界で急速に標準となりつつある依存管理ツールです。Composer を用いると、Packagist というレポジトリに登録されている PHP ライブラリーだけでなく、jQuery や CKEditor などの非 PHP ライブラリも管理することができます。また、drush make のようにコアや拡張モジュールなどにパッチを当てる作業も、Composer のプラグインを利用することで可能になります。

これまで Drupal の世界においては drush make がパッケージ管理の役割を担っていました。自分たちのコミュニティ内で全てを開発するのではなく、PHP のスタンダードを取り入れていく流れの中で Composer が採用されることになりました。ただし、Drupal 8 で正式採用されたとはいえ、以下で説明する通り Drupal 7 でも利用することが可能です。

## Drush make との違い：
drush make をご存じない方のために簡単に説明すると、一つのテキストファイルに必要なモジュールのリストを記述しておき、コマンドラインから ```drush make [オプション] [ファイル名] [パス]``` と入力することで、その記述通りのモジュール等をダウンロードして、サイトをビルドしてくれます。Jenkins などを利用してサイトビルドする場合などに特に有効なツールです。

以前から Drush make を使っていた方にとっては、Composer に切り替える具体的な利点が見えにくいかも知れないので以下に要約します：

- 上述のとおり drush make は Drupal で使えるのみで、PHP 標準ではない。より多くのプロジェクトで利用されているツールのほうが将来性が高い
- 初回のビルドの際には極めてスムーズだが、リビルドの際には問題が生じるので迂回策が必要になる
- drush make はサードパーティーライブラリーの持つ依存関係を自動的に管理できない。Composer はパッケージごとに ```composer.json``` ファイルが存在するため、パッケージがごとの依存関係を再帰的に読み込み管理してくれる

また Composer は autoload ファイルを自動生成します。オートローディング機能は、Drupal 外部のライブラリーのクラスがどのファイルにあるかを開発者が明記せずとも、それらのクラスのインスタンスの作成を可能にします。```composer install``` または ```composer update``` 実行時、Drupal が必要とするクラスを autoload ファイルに記述しておき、最初にそのクラスが必要になった時点で自動的にロードします。

## 実際に Composer を使う

Composer を使った一連の作業を行うに当たり、まず Composer をインストールする必要があります。また、Drupal 8 を走らせるには、PHP 5.5.9 以上が必要となります。

次回のポストにて詳しく触れますが、実は Drupal を Composer で管理するにはいくつかの方法があり、未だ議論が続いています。ここでは比較的簡単と思われる方法を紹介します。

### １．インストール
*nix, OSX, Windows へのインストール方法は以下のページを参照してください：
https://kohkimakimoto.github.io/getcomposer.org_doc_jp/doc/00-intro.html

### ２．Drupal をインストールするためのディレクトリを作成する
ここでは便宜的に OSX / *nix を使うことを前提として、ホームディレクトリ下に ```workspace/drupal``` というプロジェクト用ディレクトリを作成し、これを利用することにします。パスはご利用の環境や好みに合わせて適宜書き換えてください。

```mkdir ~/workspace/drupal```

### ３．```composer.json``` ファイルを作成する
```composer.json``` は、依存関係を記述するファイルです。vim や composer のコマンドを利用してこのファイルを作成することが可能です。ここでは、コミュニティメンバーが Composer を使って簡単にサイトをビルドできるよう、Packagist 上に composer.json ファイルを含むパッケージを用意してくれているので、これを利用します（https://packagist.org/packages/drupal-composer/drupal-project ）。

Composer がインストールされた状態で以下のコマンドを実行すると、Composer がパッケージをダウンロードしてくれます：

**Drupal 8 の場合:**

```
composer create-project drupal-composer/drupal-project:8.x-dev [プロジェクト用ディレクトリ名]  --stability dev --no-interaction
```

**Drupal 7 の場合:**

```
composer create-project drupal-composer/drupal-project:7.x-dev  [プロジェクト用ディレクトリ名]  --stability dev --no-interaction
```
上のコマンドを実行すると、プロジェクト用ディレクトリ内に composer.json をはじめとするファイルがダウンロードされます。

ここで一度、```composer.json``` の内部を見てみましょう。特に重要な部分についての説明を以下に記述します：

#### レポジトリ
’repositories’ のセクションでは Drupal のライブラリ（つまり拡張モジュールやテーマなど）がどこのレポジトリにあるかが記述してあります。
  

```
"repositories": [
  {
    "type": "composer",
    "url": "https://packagist.drupal-composer.org"
  }
],
```


このレポジトリは、Drupal コミュニティが正式に提供しているものではないものの、有志によって運営管理されており(http://drupal-composer.org/)、Drupal プロジェクトが提供するパッケージ（つまりコア、拡張モジュールおよびテーマ）の情報を提供しています。


実際にレポジトリの URL を見てみると、パッケージが検索でき、それぞれのパッケージの詳細が登録されているのが分かります。Composer がこのレポジトリにアクセスできない場合には、https://packagist.org にリクエストが送られます。

#### アプリケーションに必要なパッケージ
‘require’ のセクションは、アプリケーション自体に必要なパッケージです。

```
"require": {
  "composer/installers": "^1.0.20",
  "drupal/core": "8.0.*",
  "drush/drush": "dev-master",
  "drupal/console": "dev-master"
 },
```

ここでは、Composer installer、 Drupal コア、 Drush、そして Drupal console が選択されているのが分かります。もしモジュールを追加したい場合、ここにそのモジュール名を追加するのですが、このファイルを直接編集するのではなく、composer のコマンドを使って追加します。これについては後に触れます。

#### 開発に必要なパッケージ
’require-dev’ は、開発に必要なパッケージを取得するために使います。これらは Drupal のルートディレクトリ外部に保存されます。

```
"require-dev": {
  "behat/mink": "~1.6",
  "behat/mink-goutte-driver": "~1.2",
  "jcalderonzumba/gastonjs": "^1.1@dev",
  "jcalderonzumba/mink-phantomjs-driver": "dev-master#10d7c48c9a4129463052321b52450d98983c4332",
  "mikey179/vfsStream": "~1.2",
  "phpunit/phpunit": "~4.8",
  "symfony/css-selector": "2.7.*"
},
```

上のリストには Behat や PHPUnit なども含まれており、Drupal サイトだけではなくユニットテストや受け入れテストのツールも含まれており、大変便利です。

#### 安定度の選択
どの程度安定しているバージョンを利用するかを指定します。指定可能なのは stable, RC, beta, alpha, dev です。

```
"minimum-stability": "dev",
```

#### 安定版の優先
安定版を優先して使うかどうかを指定します。’true’ に設定すると、安定版がある場合はそれが他のバージョンより優先されます

```
"prefer-stable": true,
```

#### カスタムスクリプトの実行
インストール前後・アップデート前後などに、カスタムのシェルスクリプトを実行することができます。以下は ‘post-install-cmd’ を利用して、Drupal の初回インストール時に必要なディレクトリや settings.php の作成などの諸作業を行うスクリプトが走るよう記述されています。

```
"scripts": {
  "post-install-cmd": "sh ./scripts/composer/post-install.sh"
},
```

#### インストールパスの指定
Composer installer プラグインを利用して、プロジェクトのタイプごとにインストールパスを指定することができます。

```
"extra": {
  "installer-paths": {
  "web/core": ["type:drupal-core"],
    "web/modules/contrib/{$name}": ["type:drupal-module"],
    "web/profiles/contrib/{$name}": ["type:drupal-profile"],
    "web/themes/contrib/{$name}": ["type:drupal-theme"],
    "drush/contrib/{$name}": ["type:drupal-drush"]
  }
}
```


### ４．インストールの実行

プロジェクトディレクトリに移動します

```cd ~/workspace/drupal```

次にインストールのコマンドを実行します

```composer install```

```composer.json``` の記述にしたがってコンポーネントが適宜ダウンロード・インストールされます。

あとはDBを作成してインストール作業をすれば Drupal サイトが設置されます。


### ５．パッケージの追加
パッケージを追加する際は ```require``` コマンドを使います。(https://getcomposer.org/doc/03-cli.md#require )

例えば、Google Analytics モジュールを追加する場合、まず [Drupal Packagist](https://packagist.drupal-composer.org/) サイトにて Google Analytics モジュールのパッケージ名を調べます。すると、パッケージ名```drupal/google_analytics``` が見つかります。

次に、以下のコマンドを実行します

```
composer require drupal/google_analytics
```

これで、上の「アプリケーションに必要なパッケージ」の配列内にパッケージが追加されます。ただし、このコマンドはバージョンが指定されていないため、dev バージョンが使われることになります。特定のバージョンを利用したい場合はマニュアルに従い、コマンドにバージョン情報も付加します：

```
composer require drupal/google_analytics 8.2.0-RC1
```

8.2 なら何でも良い、というのであれば、```8.2.*``` と入れることも可能です。詳しくはマニュアルを参照してください。

この後 ```composer update``` を実行すると、Google Analytics モジュールが追加されます。

サードーパーテイーライブラリーは[メインの Packagist](https://packagist.org/) にて検索する必要があります。例えば、モバイル端末上でスワイプ可能なスライドショーの javascript ライブラリー https://github.com/contao-components/swipe をインストールしたい場合、メインの Packagist にてパッケージを探し('contao-components/swipe' というパッケージ名で出てきます）、```composer require``` コマンドでこれを ```composer.json``` に追加します

```
composer require contao-components/swipe
```

このようにコンポーネント情報を ```composer.json``` に追加していっても、実際のファイルはダウンロードされません。先ほどから変更を加えている ``composer.json``` ファイルがあるディレクトリにて```composer update```というコマンドを実行することで、```composer require``` で追加したライブラリのファイルがダウンロードされます。

### さいごに
Drupal が Composer を利用することになった経緯と利用方法を説明しましたが、先述の通り、Drupal における Composer の利用方法は現時点において複数あり、問題も残されています。次のポストではそれらの問題や、現時点での対応策などについて説明したいと思います。