Symfony FlexのRecipeの作り方


Symfony4.0から、Flexという仕組みが導入され、Bundleの有効化や初期設定が自動で行われるようになりました(4.0が主に宣伝されていますが、ltsの3.4でもFlexは使えます)。

たとえば

$ composer req orm-pack

みたいにコマンドを打つと、DoctrinBundleと関連ライブラリがインストール/有効化され、設定のyamlファイルがconfigディレクトリ以下に展開されます。あとは.envでDATABASE_URLを指定するだけで、すぐにDoctrineの機能が使えるようになります。

Flexの仕組み

この自動化の処理は、Flexによって行われています。Flexは、composerのプラグインとして実装されています。
やっていることはとても単純で、composerのrequireコマンドをフックし、

  • パッケージ名(エイリアス)をFlexのレシピサーバに問い合わせて、packagistのパッケージ名に解決する
  • packagistからライブラリのダウンロードを行う
  • レシピをダウンロードする
  • レシピに基づいて、バンドルの有効化や設定ファイルの展開を行う

という流れで処理をしています。

レシピの作成方法

レシピの作り方については、READMEに説明の必要もないくらい全部書いてありました。。。

主要なところだけ紹介すると、以下のような感じです。

レシピの種類

レシピは公式コントリビューションの二種類があります。公式はSymfonyのコアチームによって管理されていますが、コントリビューションのレポジトリにはPull Requestすれば自分のレシピも登録してもらうことができます。Symfony Botによって、一定の条件を満たせば自動でマージされます。

一定の条件とは、以下の通りです。

  • Pull RequestのタイトルにWIPが含まれていないこと
  • Symfony Botのレビューを通っていること
  • Pull Request送信者以外の誰かがPull Requestをapprovedすること
  • その誰かとは、以下のいずれか
    • Symfonyのマージ権限を持つ人
    • そのパッケージのオーナー
    • そのパッケージのオーナーが属しているOrganizationのメンバー

基本的には全然関係ない人が他人のライブラリのレシピを登録することはできないようになっているみたいですね。

この条件だと、一人で開発しているオレオレライブラリを登録するのは無理なのかな?と思いましたが、レシピの信頼性を担保するためには仕方ないのかもしれません。

manifest.json

レシピの定義は、manifest.jsonというファイルに記述します。
定義内容はオプションとコンフィギュレータで構成されています、

オプション

現状、オプションとして定義されているのはaliasのみです。
aliasを定義しておくと、composer req [alias]みたいに実行することができます。
ただし、コントリビューションのレシピでは使用できません(後述の非公開レシピだと利用可能です)。

コンフィギュレータ

バンドルの有効化や、設定ファイルの展開は、コンフィギュレータで定義します。
以下の8つのコンフィギュレータが定義できます。

  • copy-from-recipe
  • copy-from-package
  • bundles
  • env
  • composer-scripts
  • gitignore
  • post-install-output

例えばバンドルが自動で有効化されるのは、bundelsで定義されています。

manifest.jsonに以下のように記述すると、

{
    "bundles": {
        "Acme\\Bundle\\HogeBundle\\DebugBundle": ["all", true],
    }
}

config/bundles.phpに追記されます。

// config/bundles.php
return [
    'Acme\Bundle\HogeBundle\DebugBundle' => ['all' => true]
];

他の定義については、READMEを参考にしてみてください。

ちなみにREADMEには、

There are eight types of tasks, which are called configurators: 
copy-from-recipe, copy-from-package, bundles, env, composer-scripts, gitignore, and post-install-output.

There are eight types of tasksて書いてあるけどどうみても7つしありません。

非公開のレシピを作成する

ここまでは、公開されているバンドルやライブラリのレシピについての説明でしたが、非公開のレシピも作成することができます。

非公開レシピの作成については以下で解説されていますので、ご参考まで。

非公開レシピの作成方法についても別の記事でまとめようと思います。

以上です。

それではよいFlexライフを!