この記事は、Drupal Advent Calendar 2022 の 22 日目です。
Drupal recipes は、Drupal サイトに特定の機能を追加できるようにする新しい仕組みです。Portland DrupalCon 2022 の Driesnote で Starter templates として紹介されたアイデアで、現在では Drupal recipes という名前で Distributions & Recipes initiative によって開発が進められています。
※Drupal コミュニティの initiative とは、特定の関心事に基づく作業グループのことです。中でも Dries 氏が特に重要と感じたものは Strategic initiatives に指定されています。Distributions & Recipes initiative も Startegic initiatives の1つです。
現在、こちらのリポジトリで仕様の検討と試験的な実装による検証を繰り返している段階と思われます。全体の計画や現在の状況は、下記ページで知ることができます。
- Distributions and Recipes initiative overview and roadmap
- drupal.org のプロジェクトページ
- Drupal recipe roadmap
目指すもの
Drupal は高度な柔軟性と拡張性を備えていますが、それを活用して特定の要件を満たす構成を実現する仕事はサイトビルダーに任されています。多くの初心者はここで行き詰まります。ですが、事前に定義された構成設定(例:SEO 対策、ブログ、ショッピングカート、等)が汎用的な「レシピ」として利用できるとしたらどうでしょう。もっと簡単にサイトを構築できると思いませんか?これが Drupal recipes の目指すところです。
Distributions & Recipes initiative としては、次のような目標を掲げています。
- 必要なレシピを(将来は Project Browser で)探せる
- 同じサイトで複数のレシピを使用できる
- インストール後のサイトにもレシピを導入できる
- 開始時の構成を共有する大量の複数サイトを容易に保守できる
- インストール済みのサイトを簡単に更新できる(Update Helper の利用)
- drupal.org と Composer によるサポートの強化
- デモ用コンテンツを同梱できる
従来、定義済みの構成設定を利用させる手段としてディストリビューションやインストールプロファイルが使われてきました。これらはサイト構成全体をインストール時の初期状態として提供します。他方、レシピは(サイト全体ではなく)個別の機能や構成設定を提供するもので、既にインストール済みのサイトに後から追加することや、同じサイトで複数のレシピを組み合わせて利用することもできます。
詳細については、Alex Pott 氏(プロジェクトリード)による DrupalCon Prague 2022 のセッションで解説とデモを見ることができます。
サンプル
上記セッションのデモを参考に Drupal 10 でサンプルを作ってみました。現在、Drupal recipes の試験実装を利用するには Drupal core にパッチを適用する必要があるため、自作のインストールプロファイル「SQbase」の 10.0-demo-recipe ブランチとして、適用済みの D10 プロジェクトを公開しています。
試してみるには、まず、ローカルサイトをインストールします。
(自作の Drupal 実習用仮想マシン環境 ffdsm での例を示します)
### サイトをインストールする
$ cd /var/www
$ git clone https://github.com/bkenro/sqbase.git -b 10.0-demo-recipe
$ cd sqbase
$ composer install
$ drush @local sql:create -y
$ drush @local site:install sqbase -y
これでローカルのサイトが立ち上がります。初期状態では、記事と基本ページという2つのコンテンツタイプが用意されています。
このプロジェクトには、現行の Drupal recipes の試験実装、およびそれを利用したレシピのサンプル(web/recipes/myevent フォルダ)が組み込まれています。サンプルの内容は「イベント」というコンテンツタイプの追加と、関連するロールと権限を設定するものです。
レシピの定義ファイル recipe.yml ファイルを示します。
name: 'My Event'
description: 'イベントのコンテンツタイプを追加する Drupal recipe サンプル'
type: 'Content type'
install:
- datetime_range
- field
- field_group
- field_ui
- menu_ui
- node
- path
- text
config:
actions:
user.role.editor:
ensure_exists:
label: 'イベント編集者'
grantPermissions:
- 'delete any event content'
- 'edit any event content'
install キーは、レシピに必要なコンポーネント(モジュール)のリストです。レシピ適用時に自動インストールされます。また、config / actions キーは、Config Actions という API を利用して新しいロールと権限を追加する設定です。
これを、いまインストールしたサイトに適用してみます。試験実装では Drupal CLI の drupal コマンドに recipe というサブコマンドが追加されるので、この引数として組み込むレシピのパスを指定します。
### Webルートに移動してCLIでレシピを組み込む
$ cd web
$ php core/scripts/drupal recipe recipes/myevent
[OK] My Event applied successfully
正常に実行されると、「イベント」コンテンツタイプ、および関連するロールと権限が追加されるはずです。
上記は自作プロファイルを利用した例でしたが、別のインストールプロファイルでインストールしたサイトでも同様にこのレシピを適用することができます。
### 最小プロファイルでインストールする例
$ drush @local site:install minimal -y
### 標準プロファイルでインストールする例
$ drush @local site:install standard -y
### Umami プロファイルでインストールする例
$ drush @local site:install demo_umami -y
どのプロファイルでインストールした場合でも、myevent レシピを適用することで、上の例と同様、「イベント」コンテンツタイプや関連するロール/権限が追加されることがわかると思います。
このように、レシピを利用すると、サイトのインストールに使用したプロファイル(またはディストリビューション)に関係なく、既にインストール済みのサイトに対して、特定の機能や構成を追加で組み込むことができます。
SEO 対策、ブログ機能、ショッピングカート機能、…といった汎用的な「レシピ」が豊富に提供されるようになれば、サイト要件に応じて必要なレシピを組み込むことで、高度な Web アプリケーションを簡単に構築できるようになるかもしれません。
おわりに
ディストリビューションのようにサイト全体の構成設定が一体化したモノリシックな構造ではなく、より小さい粒度の汎用的な機能や構成をレシピとして定義できるようになれば、より幅広い層の人たちが Drupal のサイトビルダーとして活躍できる可能性があります。
Drupal core の機能をネジ・クギとするなら、レシピは目的ごとに用意された汎用的な組み立て部品、ディストリビューションはそれらをパッケージした手作りキットのようなイメージでとらえることができるでしょうか。
他方、開発中のリポジトリのドキュメントなどを見ると、解決しなければならない課題も少なくないようで、かなり挑戦的な取り組みのように思えます。最終的に Drupal core に取り込まれる時期や、先述の目標がすべて達成されるのかどうかはまだわかりません。ただ、個人的には、ディストリビューションの作成やメンテナンスという観点から、現行の実装でもレシピは十分に有用な技術だと考えています。今後の展開に注目していきたいと思います。