Drupal の頼れるコマンドラインツールである「 Drush 」のメジャーアップデートバージョン Drush 7 が先日ついにリリースされました。 本記事ではその Drush 7 のインストール方法と新たに統合された Boris という REPL ライブラリについてご説明してみたいと思います。

このページをご覧になっている方の中には「 Drush って何?」という方もいらっしゃるでしょうか。 Drush が何なのか知らないという方のために手短のご説明してみたいと思います。

「 Drush 」とは Drupal の開発用のコマンドラインツールで Drupal の開発/運用周りの各種作業を効率化してくれるツールです。 Drupal + Shell で Drush で、読み方は「ドラッシュ」と読みます。 他の CMS や Web アプリケーションフレームワークでの開発に馴染みのある方であれば「あぁ、ああいうツールのことか」とパッとおわかりいただけるのではないでしょうか。 Ruby on Rails でいう rails コマンド、 Laravel の laravel や Symfony の symfony 、 WordPress の wp-cli の Drupal 版と捉えていただくとよろしいかと思います。 Drupal は CMS と Web アプリケーションフレームワークの両方の性質を持っていることもあり、 Drush は Drupal 開発に必須ではありません。 Drush を使わなくても Drupal 開発は問題なく行えます。 ただ Drush を入れると Drupal の開発効率がぐんと上がってきますので、これから本格的に Drupal 開発をやっていきたいという方はぜひ Drush を早い段階で入れてみることをご検討してみてください。

そんな Drush ですが、別記事でもご紹介していますとおりこれまでは数多くのインストール方法が用意されていました。

これが Drush 7 あたりからは Composer 一本になっていくようです。 Composer に慣れ親しんだ方であればこのあたりはとてもかんたんなのかなと思うのですが、今回は Composer にあまり馴染みのない方も対象にインストール方法をご紹介していきたいと思います。

Drush 7 のインストール方法

Drush 7 を入れるためのステップは以下の 3 ステップです。

  1. 古い Drush をアンインストール
  2. Composer をインストール
  3. Drush 7 をインストール

以下順番に見ていきたいと思います。

1. 古い Drush をアンインストール

バージョン 6.x などの古い Drush がインストールされている場合はまずはそれをアンインストール(無効化だけでも OK )します。 お使いの Drush のバージョンを確認するには次のコマンドを実行しましょう。

$ drush --version

どういう方法で入れた Drush かパッとわかる場合はそのインストール方法に応じたアンインストールを行います。 適切な方法で入れた Drush であればそれなりのアンインストール方法が用意されているはずです。 たとえば Mac の Homebrew で入れた Drush の場合ですと次のワンコマンドで OK です。

drush は残して無効化だけしたい場合:

$ brew unlink drush  

drush を完全にアンインストールしたい場合:

$ brew uninstall drush

このとき「 drush 」というファイルだけを削除してしまうようなことは絶対に避けましょう(笑)

どうやって入れた Drush かわからない場合は Drush がファイルシステムのどこにいるのかというのがヒントになるかもしれません。 Drush の居場所を調べるには以下のコマンドのいずれかを実行します。

$ which drush

$ type drush

無事 Drush がアンインストールされたら次のステップに進みます。

2. Composer をインストール

Drush 7 を入れるには Composer が必要です。 Composer というのは近年デファクトスタンダードとなっている PHP のパッケージ管理ツール(依存管理ツール)です。 プロジェクト単位でのライブラリのインストールやオートローダーなどの機能を提供しており、現在主流となっている多くの PHP フレームワークが Composer を利用しています。

このステップについては、別記事の中ですでにご説明しているのでそちらをご参考にしていただければと思います。

Composer が無事インストールできたらいよいよ Drush 7 をインストールします。 Composer がうまく入ったかどうかわからない場合は以下のコマンドなどで確認してみてください。

$ composer --version

3. Drush 7 をインストール

Drush 7 をインストールしましょう。 といっても主要な処理はすべて Composer がやってくれるので、やるべきことはちょろっとコマンドを打つだけです。

Drush はシステムグローバルにインストールしておいた方がよいのでその形でインストールするため以下のコマンドを実行します。

$ composer global require drush/drush:7.x

こうすると Composer が自動でパッケージ管理用のファイルを作成し(既存のものがある場合は編集し)、依存するパッケージも含めて自動でインストールしてきてくれます。 本当にすばらしい時代です。

おそらく次のようなメッセージが流れて処理が進むかと思います。


Changed current directory to /Users/hgoto/.composer
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)

... 

Writing lock file
Generating autoload files

ちなみに Drush 7 は PHP の 5.3 以上と以下のパッケージ( : 以降はバージョン)に依存しています。

  • d11wtq/boris: ~1.0
  • symfony/yaml: ~2.2
  • symfony/var-dumper: ^2.6.3
  • pear/console_table: ~1.2.0

PHP や Composer のバージョンが古かったりするとうまくインストールできないかと思いますのでご注意ください。 Composer を更新するには次のコマンドを実行します。

$ composer self-update

無事 Drush 7 がインストールできたら以下のコマンドで無事インストールされていることを確認しましょう。 7 以降のバージョンが表示されれば OK です。

$ drush --version

REPL ライブラリ Boris

Drush 7 は Drush 6 からいくつかの改善が加えられているようですが、最大の目玉は何といっても Boris ライブラリの統合でしょう。

Boris とは

Boris というのは PHP の REPL ライブラリです。 Ruby でいう pry 、 Python でいうところの ipythonbpython に近い機能を PHP で提供してくれます。

基本的な使い方は php -a コマンドと同じですが、式の結果を自動でシンタックスハイライトして出力してくれるところがポイントです。

Boris を単体で使う

Drush 7 を入れたら Boris も自動的にインストールされているはずです。 コマンド名もそのまま boris なので試してみましょう。

$ boris

適当に PHP の式を書くと、最後の式の値がよきように色付けされて自動で出力されます。


[1] boris> new DateTime();
// object(DateTime)(
//   'date' => '2015-06-11 10:59:59.000000',
//   'timezone_type' => 3,
//   'timezone' => 'Asia/Tokyo'
// )

boris から脱出するには Mac の場合は Ctrl + c を押します。 長いループの途中に Ctrl + c を押すと「 Boris からは脱出せずにループのみ break する」なんてこともできるようになっています。

$ boris

[1] boris> for ($i = 0; $i < 100; $i++) {
[1]     *> echo $i . PHP_EOL;
[1]     *> sleep($i);
[1]     *> }
0
1
2
^CCancelling...
[2] boris>

起動時に読み込むスクリプトやインスペクタを入れ替えたりといったことも可能で、そのあたりは以下の記事にわかりやすく解説されています。 興味のある方は参照してみてください。

Drupal プロジェクトで Boris を使う

Drush 7 には Boris が統合されており、サブコマンド core-cli で Boris を起動することができます。


$ drush core-cli
[1] self> variable_get('site_name', '');
"(現在の Drupal サイトのサイト名)"

drush eval などと同じく Drupal のブートストラップ処理が終わった後の状態から始まるので、 Drupal の API を利用して通常ページ内で行う処理を走らせることが可能です。 drush eval "var_dump(...)" を繰り返す必要がなくなったので API の使い方などをサクサク確認することができますね。 作るものの完成形が固まっている状態ではなく、方法を探りながら探索的に開発するときにはものすごく効果を発揮してくれることと思います。

ちなみに core-cli にはエイリアスとして php というものも用意されているため drush php と打っても drush core-cli と同じ処理を走らせることが可能です。

PHP/Drupal の開発で個人的にいちばんやりづらいと感じていたところがこの「よい REPL がないこと」(正確には「私がないと思っていた」だけですね)だったので、この Boris 統合は個人的にとても大きな改善ポイントです。 今後使い込んでいってプラスアルファでいいところを見つけたらまたこちらで共有させていただきます。

以上です。