Drupal7 設定値をモジュール化しよう ~ Featuresの使い方 ~

# 初めに
Drupal7でDBの内容をソース管理したい！別環境に同じ設定を楽に反映したい！
そんな願いをかなえてくれるFeaturesモジュールを紹介します。
この記事はほとんど導入部分だけの説明になりますので、気になる方はぜひお試しください。

# 導入モジュール
とりあえず、下記をインストール・有効化してみてください。

* Features
* Features Extra 
* Strongarm 
* Universally Unique IDentifier (UUID)
* UUID Features
* Diff

# 使い方
## モジュール化
まずはFeaturesモジュールを有効にすれば最低限の機能は利用できます。

**1. Structure(サイト構築) > features を表示します。**
このページがメインページで、プロジェクト内に存在するすべてのfeatureモジュールが表示されます。
導入モジュールによってはfeature化されたサンプルが存在するため何かしら表示されていると思います。
<img width="1105" alt="featuresページ.png" src="https://qiita-image-store.s3.amazonaws.com/0/41498/d37389ee-c8c8-50ee-16e3-a46749cf5ea4.png">


**2. CREATE FEATUREタブをクリックしてページを表示します。**
このページの右側が出力項目です。選択肢によって、さまざまな単位でモジュールが作成できます。
![create_features.png](https://qiita-image-store.s3.amazonaws.com/0/41498/20cd5471-e871-d230-57ab-a455dda26ebb.png)
試しにStrongarmの設定を選択してみた状態です。
この状態で「Download features」ボタンをクリックすると、モジュールがダウンロードできます。

## 有効化
**1. 出力したモジュールをプロジェクトでモジュールが有効になる場所に配置します。**
迷ったときは「/sites/all/modules/features」配下に置くのがベストだと思います。
引用 : [Basic Directory Structure of a Drupal 7 Project](https://www.drupal.org/node/2621480)

**2. キャッシュクリアをして、「Structure(サイト構築) > features」を表示します。**
配置したモジュールが一覧に登場するので、チェックをつけて設定を保存すればモジュールが有効化されます。

**おまけ**
feturesで出力したファイルは「モジュール」なので、通常のモジュール一覧にも登場するようになります。

## Recreate
featuresでモジュール化すると、その単位で何回も再作成ができます。
一覧上のRecreateリンクをクリックすると、
対象の項目がチェックがついた状態でモジュール作成がスタートできます。
そこで項目を増減した上で出力してもOKです。

# よく使う出力
## Strongarm
Variablesの値を出力できます。
コントリビューションモジュールでサイトに1つしか設定しない項目は、
ほぼこれでモジュール化できると思ってOKです。
VariablesのKeyは原則的にモジュール名から始まる命名規則なので、結構わかりやすいです。

## Content type / Field instanes / Field bases
コンテンツタイプの設定がモジュール化できます。
**Field instanes** はコンテンツタイプとフィールド設定の紐づけ定義が出力され、
**Field bases** はフィールド定義そのものが出力されます。

Content type を選択すると、Field instanesとField basesが自動選択されます。
(自動選択が嫌な場合は、SHOW ADVANCED OPTIONS の「Add auto-detected dependencies」を外せばOKです)

## Views
Views設定はすでにエクスポート/インポートを持っていますが、同じコードでモジュール化されます。
一つ一つエクスポート/インポートを実行するより便利です。

## Role & Permission
ロールとパーミッション設定を出力可能です。
ロールとパーミッションの紐づけが「ロール名称」なので名称変更し、再出力、別環境で有効化すると・・・
新しい名称でロールが新規作成され、旧名称がそのまま残ってしまうなどちょっと癖はあります。

------
2016年12月現在、
これ以外にもよく使われているモジュールは、
ほぼすべてfeaturesで設定値をモジュール化できるようになっています。
上記の3つを試すとほかのモジュール化の要領がつかめると思います。

# ステータスの見方
Feturesの素敵なところは、モジュール側の設定値と現在のDB項目を比較できるところにあります。
![オーバーライド.png](https://qiita-image-store.s3.amazonaws.com/0/41498/4e2d8cd8-cb2e-923c-e5b8-154061a787e8.png)
「オーバーライド」となっているところが差分があるモジュールです。
前回featureを有効化した後
管理画面上で該当項目を更新した or モジュール側を更新した場合にこのような表記になります。
「オーバーライド」をクリックすると詳細ページへ遷移できます。

![リバート.png](https://qiita-image-store.s3.amazonaws.com/0/41498/874cfb5a-56ff-99bb-66e3-c9be4bed1984.png)

差分がある項目にチェックボックスが登場するので、
モジュールが正の場合は、チェックを付けて「Revert components」をクリックしましょう。モジュールの内容でサイトデータが更新されます。
Diffモジュールを導入すれば、管理画面上でソースコードベースで差分をみれるのでおすすめです。

# drush
featuresの扱いに慣れてきたらdrushコマンドで操作すると早いです。
Drupal.orgの記事がきれいにまとまっていたので、下記を参照ください。
[Features & Drush] (https://www.drupal.org/docs/7/contrib/features/features-drush)

# はまりどころ
FeaturesはDBデータをもとにモジュールを作成します。

開発中は管理画面からいろいろ設定を変えて検証することが多いのですが、
試してやめた設定をそのまま放置したり、反映環境より古いDBを利用していると
Features出力時に余分な設定がコードがされるので、
そのまま別環境で反映してしまうと泣きを見ることになります。

対策として運用でカバーする必要があるかなと思います。

* 開発単位を小さくして、基準となる環境のDBを頻繁に取り込む
* マージ前にコードレビューで差分をしっかり確認

などを注意してやっています。

# Drupal8では
Configuration Managerの利用をオススメします。
AプロジェクトからBプロジェクトに機能をコピーしたい！って時にはD8でもfeaturesが便利だそうです。

DrupalCon Dublin のスライド動画がとっても良いので見てみてください。
https://www.youtube.com/watch?v=57t_CS2wbHI

# 最後に
Drupal8が登場しているとはいえDrupal7サイトの開発・保守は当分続くと思っています。
Fetauresの導入がないサイトを保守で引き取って、徐々にfeaturesでモジュール化して、反映作業を楽にしたケースもあります。

featuresは詳細を書き始めるとと本一冊できるかも・・・くらい濃い機能なので
不明点、これ間違ってる・・・！などあればコメントをお願いします。