【Drupal 8】Composerを使ってモジュールをインストールする

Drupal 7までは、特定のモジュールをダウンロードして有効化するときは`drush`コマンド一発で出来ていました。

```bash
drush en -y [contrib_module_name]
```

しかし、Drupal 8だと`drush`コマンドはモジュールの有効化／無効化はできてもダウンロードはしてくれません。

加えて、Drupal 8の多くのモジュールはdrupalに依存しない汎用的なphpライブラリを読み込んでおり、その依存関係をcomposerが自動的に解決してくれます。
そして、Drupal 8はcomposerによってモジュール管理するように設計されています。

そういうことなので、モジュールのインストールに関しては、基本的にcomposerコマンドを利用しましょう。


##Composer本体をインストールする

もしまだComposer自体をインストールしていなければ先に入れましょう。

```bash
cd ~
curl -sS https://getcomposer.org/installer | php
composer --version
```

Composerを動作させるには、ドキュメントルート直下にcomposer.jsonファイルが必要ですが、Drupal 8は初めからドキュメントルート直下にファイル設置されているので新たに作成する必要はありません。

macOSの場合は、Homebrewでもっと簡単にインストール可能です。

```bash
brew install composer
```


以上で、composerコマンドの実行環境は整いました。



##パッケージのリポジトリを設定する

composerにはデフォルトではdrupal.orgのリポジトリが登録されていません。
なので、drupal.orgのリポジトリURLを追加します。

```bash
cd /path/to/drupalroot
composer config repositories.drupal composer https://packages.drupal.org/8
```

コマンド実行されると以下の行がcomposer.jsonファイルに自動追加されます。

```json
{
  "repositories": {
     "drupal": {
         "type": "composer",
         "url": "https://packages.drupal.org/8"
     },
  }
}
```


##テーマやモジュールのインストール先を設定する

コントリビュートモジュール・テーマ、およびカスタムモジュール・テーマのインストール先を設定します。

Drupal 8は、modulesフォルダの下にサブフォルダを作成することを推奨しています。
サブフォルダ名は、コントリビュートモジュールの場合は”contrib”フォルダ、カスタムモジュールの場合は”custom”フォルダです。モジュールだけでなくテーマに関しても同様です。

Installing Modules | Drupal.org
https://www.drupal.org/docs/8/extending-drupal-8/installing-modules#mod_subfolders


期待されるフォルダ構造はこのようになります。

```text
|-core
| |-modules
| |-themes
| | |-bartik
| | |-seven
|-modules
| |-contrib
| |-custom 
|-themes
| |-contrib
| | |-omega
| |-custom
| | |-omega_subtheme
```

それでは composer.json ファイルにインストールパスを設定します。


```bash
vim composer.json
```

```json


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


##モジュールをインストールする

今回は、既存の開発プロジェクトで特定のモジュールだけをインストールする場合を想定して、操作手順を紹介します。

**例）panelsモジュールをインストールする**

まずは、`composer require` コマンドを使って`composer.json`にパッケージ情報を追加します。

```bash
cd /path/to/drupalroot
composer require --no-update --no-interaction drupal/panels
```
指定可能なオプション

* `--no-interaction` ･･･ 対話型のメッセージを表示しない
* `--update-no-dev` ･･･ 依存関係にあるものを```--no-dev```を付けた状態でアップデートする
* `--no-update` ･･･ 依存関係のアップデートを行わない

基本的に既存の開発プロジェクトで特定のモジュールだけをインストールする場合、`--update-no-dev` は指定することはありません。
ほかのパッケージが更新されてしまわないように `--no-update` を普段使うことになると思います。


最新バージョンではなく、あえて古いバージョンを使いたければ、下のようにパッケージ名の後ろにバージョンを付けてください。

```zsh
composer require --update-no-dev --no-interaction drupal/panels:^1.0@alpha
```

<br>

次に`composer update` コマンドを使って モジュールダウンロードと `composer.lock` を更新します。

```zsh
composer update --no-interaction drupal/panels
```


パッケージのインストールが完了すると、次の通りにファイル更新がされていることが確認できるはずです。


```zsh
satoj@macbook dev % git status
On branch develop
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   composer.json
        modified:   composer.lock
        modified:   vendor/composer/installed.json

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        docroot/modules/contrib/panels/

```


##モジュールを有効化する

composerコマンドによってモジュール設置ができたら、drushコマンドでモジュールを有効化します。

もしまだdrushコマンドをインストールしていなればこちらの記事が参考になります。
http://qiita.com/J_Sugar__/items/e2993282880471c0d3db

```bash
drush en -y panels
```

以上でモジュールの機能が使えるようになります。