Drupal サイトでモジュール一覧を csv で取得する方法

今回も Drupal の開発ネタで、掲題のとおり「 Drupal サイトで利用されているモジュールの一覧を csv として取得する方法 」についてです。

個人的には、サイトの引き継ぎのときや、モジュールのアップデートをまとめてかけたいときに、モジュール一覧をスプレッドシートで管理したくなることがときどきあるのですが、そんな場合にはモジュール一覧が csv 形式で取得できるととても便利です。

2 つほど方法があるので、シンプルな方から順にご説明していきます。

  • Drush コマンドを使った方法
  • スクリプトを使った方法

Drush コマンドを使った方法

まずは Drush コマンドを使った方法をご紹介します。

まさにこの目的のためのサブコマンドとオプションが用意されているのでそれを使用しましょう。

drush pm-list

Drush のサブコマンド pm-list (pml) を使うと、プロジェクト(モジュール + テーマ)の一覧を出力することができます。

$ drush pml
 Package  Name                             Type    Status         Version
 Core     Actions (action)                 Module  Not installed  8.4.3
 Core     Activity Tracker (tracker)       Module  Not installed  8.4.3
 Core     Aggregator (aggregator)          Module  Not installed  8.4.3
 Core     Automated Cron (automated_cron)  Module  Enabled        8.4.3
 Core     Ban (ban)                        Module  Not installed  8.4.3
 Core     BigPipe (big_pipe)               Module  Not installed  8.4.3
 Core     Block (block)                    Module  Enabled        8.4.3
 ...

これにオプション --format=csv を追加すると、出力形式が csv になります。

$ drush pml --format=csv
Core,Actions (action),Module,Not installed,8.4.3
Core,Activity Tracker (tracker),Module,Not installed,8.4.3
Core,Aggregator (aggregator),Module,Not installed,8.4.3
Core,Automated Cron (automated_cron),Module,Enabled,8.4.3
Core,Ban (ban),Module,Not installed,8.4.3
Core,BigPipe (big_pipe),Module,Not installed,8.4.3
Core,Block (block),Module,Enabled,8.4.3
...

drush pm-list には他にもいくつかオプションが用意されており、そのうち私がよく利用するものは次の 3 つです。

  • --fields: 出力するカラムを指定することができます。指定可能な値は次の 5 つです: package / name / type / status / version 。デフォルトではすべてのカラムが出力されます。
  • --status: ステータスで絞り込みができます。利用できる値は enabled disabled "not installed" のいずれかです。コンマ( , )区切りで複数の値を指定することもできます。
  • --type: プロジェクトのタイプで絞り込みができます。利用できる値は module theme のいずれかです。

例えば、対象を有効化されたモジュールだけに絞って、「パッケージ」「モジュール名」「バージョン」の 3 つの情報を csv 形式で出力したい場合は次のようにオプションを指定すれば OK です。

$ drush pml --format=csv --fields="package,name,version" --status=enabled --type=module
Core,Automated Cron (automated_cron),8.3.7
Core,Block (block),8.3.7
Core,Breakpoint (breakpoint),8.3.7
Core,CKEditor (ckeditor),8.3.7
Core,Color (color),8.3.7
...

drush pm-updatestatus

同様の --format オプションは、アップデートのあるプロジェクトを一覧するための Drush サブコマンド pm-updatestatus (ups) でも利用することができます。

$ drush ups --format=csv
利用可能なアップデートを確認中...
Checking available update data for Drupal.
Checking available update data for CAPTCHA (captcha).
Checking available update data for Coffee (coffee).
Checking available update data for Date Popup (date_popup).
Checking available update data for Font Awesome (fontawesome).
...
drupal,8.4.1,8.4.3,アップデートが利用可能です
date_popup,8.x-1.0-beta2,8.x-1.0,アップデートが利用可能です
fontawesome,8.x-1.2,8.x-1.3,アップデートが利用可能です
menu_position,8.x-1.x-dev,8.x-1.x-dev,アップデートが利用可能です
rabbit_hole,8.x-1.0-beta3,8.x-1.0-beta4,アップデートが利用可能です
...

--fields オプションがある点は drush pm-list と共通ですが、 pm-updatestatus (ups) の場合は指定できる値のパターンが少し異なります。

  • --fields: 次の値を利用することができます: nameshort name でも可) / label / candidate_versionproposed version でも可) / existing_versioninstalled version でも可) / status / status_msgmessage でも可)。

実行サンプルは次のとおりです。

$ drush ups --format=csv --fields="name,label,installed version,candidate_version,message"
drupal,Drupal,8.4.1,8.4.3,アップデートが利用可能です
date_popup,Date Popup (date_popup),8.x-1.0-beta2,8.x-1.0,アップデートが利用可能です
fontawesome,Font Awesome (fontawesome),8.x-1.2,8.x-1.3,アップデートが利用可能です
menu_position,Menu position (menu_position),8.x-1.x-dev,8.x-1.x-dev,アップデートが利用可能です
rabbit_hole,Rabbit Hole (rabbit_hole),8.x-1.0-beta3,8.x-1.0-beta4,アップデートが利用可能です
...

name (あるいは short name )がモジュールのマシン名を指す点が drush pm-list とは異なり、これは tsv を別のスクリプトで処理するときなどに便利です。

スクリプトを使った方法

上の Drush コマンドーー drush pmldrush ups を使った方法で事足りる場合はそれらを使えばよいのですが、不十分な場合にはスクリプトの作成が必要です。

例えば、モジュールの description の情報は上のコマンドでは取得できないため、 description を一覧に含めたい場合にはスクリプトを書く必要があります。

実際に利用するクラスや関数としては、 Drupal 8 の場合は module_handlerinfo_parser あたりのサービスクラスを、 Drupal 7 の場合は module_list()system_get_info() あたりの関数を使うとおおよそ必要な情報は取得することができます。

例として、モジュールの「マシン名」「ラベル」「 description 」「パッケージ」の 4 つの情報を取得して csv 形式で出力したい場合のスクリプトのサンプルを掲載します。

Drupal 8 の場合

drupal_8_module_list.php:

<?php

/**
 * @file
 * Drupal 8 でモジュールを csv 形式で出力するためのスクリプトです。
 */

main();

/**
 * メイン関数: モジュールの情報を csv 形式で標準出力に出力する
 */
function main() {
  $modules = \Drupal::service('module_handler')->getModuleList();
  $info_parser = \Drupal::service('info_parser');

  $module_infos = [];
  foreach ($modules as $name => $extension) {
    $module_name = $extension->getName();

    $module_info = $info_parser->parse($extension->getPathname());
    $label = $module_info['name'];
    $description = $module_info['description'];
    $package = $module_info['package'];

    $module_infos[] = [
      $module_name,
      $label,
      $description,
      $package,
    ];
  }

  write_as_csv(STDOUT, $module_infos);
}

/**
 * 指定されたファイルに対して csv を出力する
 */
function write_as_csv($fp, $rows) {
  foreach ($rows as $row) {
    fputcsv($fp, $row);
  }
}

Drupal 7 の場合

drupal_7_module_list.php:

<?php

/**
 * @file
 * Drupal 7 でモジュールを csv 形式で出力するためのスクリプトです。
 */

main();

/**
 * メイン関数: モジュールの情報を csv 形式で標準出力に出力する
 */
function main() {
  $modules = module_list();

  $module_infos = [];
  foreach ($modules as $module_name => $label) {
    $info = system_get_info('module', $module_name);
    $description = $info['description'];
    $package = $info['package'];

    $module_infos[] = [
      $module_name,
      $label,
      $description,
      $package,
    ];
  }

  write_as_csv(STDOUT, $module_infos);
}

/**
 * 指定されたファイルに対して csv を出力する
 */
function write_as_csv($fp, $rows) {
  foreach ($rows as $row) {
    fputcsv($fp, $row);
  }
}

スクリプトの実行方法

上のスクリプトを実際に利用するには、上のスクリプトを適当な場所に保存した上で Drush のサブコマンド php-script (scr) で実行すれば OK です。

$ drush scr drupal_8_module_list.php
automated_cron,"Automated Cron","Provides an automated way to run cron jobs, by executing them at the end of a server response.",Core
block,Block,"Controls the visual building blocks a page is constructed with. Blocks are boxes of content rendered into an area, or region, of a web page.",Core
block_content,"Custom Block","Allows the creation of custom blocks through the user interface.",Core
breakpoint,Breakpoint,"Manage breakpoints and breakpoint groups for responsive designs.",Core
...

ファイルに保存したい場合は出力先のパスを指定しましょう。

$ # modules.csv に保存します
$ drush scr drupal_8_module_list.php > modules.csv

スクリプトを使った方法については以上です。

ちなみに、モジュールのアップデート情報を取り扱う処理は少し複雑になるので、独自のスクリプトの中で直接取りにいくのではなく、アップデート情報は drush ups コマンドで取得しておいて、オフラインでそれを利用する方法がかんたんでおすすめです。

drush ups が行っているようなアップデート情報の取得処理をスクリプト内でどうしても行いたい場合には、モジュールのリリース情報は次の URL で XML 形式で取得できるのでこれを利用するとよいかと思います。

https://updates.drupal.org/release-history/[モジュール名]/[対象のコアバージョン]

例えば、 Drupal 7 の ctools モジュールの場合だと URL は次のとおりとなります。

https://updates.drupal.org/release-history/ctools/7.x

以上、 Drupal サイトで利用されているモジュールの一覧を csv として取得する方法 についてのご説明でした。