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
: 次の値を利用することができます:name
(short name
でも可) /label
/candidate_version
(proposed version
でも可) /existing_version
(installed version
でも可) /status
/status_msg
(message
でも可)。
実行サンプルは次のとおりです。
$ 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 pml
や drush ups
を使った方法で事足りる場合はそれらを使えばよいのですが、不十分な場合にはスクリプトの作成が必要です。
例えば、モジュールの description
の情報は上のコマンドでは取得できないため、 description
を一覧に含めたい場合にはスクリプトを書く必要があります。
実際に利用するクラスや関数としては、 Drupal 8 の場合は module_handler
、 info_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 として取得する方法 についてのご説明でした。