この記事はQiita AdventCalendar 2021 PHPの8日目の記事です。
こんにちは、こんばんわ、kubotak(@kubotak_public)です。
早速ですがタイトルの通り「PHPコードを消すライブラリ」を作りました。
まずはこのライブラリの生まれた背景と用途について説明します。もしよければstarつけてください。
これはなに?
以下のようにコメントでコードを挟み、composerで導入したコマンドを実行することで対象のコードを削除します。
before
public function code() { /** php-del start flag-a */ $something = 1; /** php-del end flag-a */ }
run command
vendor/bin/php-del flag-a
after
public function code() { }
なぜ作ったのか?
使い方は簡単ですね。しかしこんな仕組み、いつ使うんでしょうか?
話が変わってしまうんですが、弊社ではスクラム開発を行っており、Feature Flag(Toggle)を利用してデプロイとリリースを分離しています。
変更影響があるコードはFeature Flagによって管理され、それがONになることで有効化するようになっています。
(イメージ)
if ($featureFlag) { // 新しい処理 return; } // 既存の処理
※弊社のFeature Flagについては過去記事を参照ください
Feature toggles を複数の環境へ即時反映する仕組みを開発しました - M&Aクラウド開発者ブログ
察しの良い方はすでにお気づきかと思います。
このコード、Feature FlagをONにした後はif文及び既存の処理は不要になります。
今まではこれを消すタスクを積んで消す必要がありました。
また、このコードを追加していない開発者が見た場合、どのコードを消すべきかちゃんとコードを読み解く必要もあります。
ほしいもの
つまり、Feature Flagを使うコードを実装する時点で、消すことも想定してコードを書いておいて、後から自動で消えてしまえば負担が少ないのではないか・・・
という思いから出来上がったのがこのphp-delです。
先程のコードに適応すると次のようになります。
/** php-del start flag */ if ($featureFlag) { /** php-del ignore start */ // 新しい処理 /** php-del ignore end */ return; } /** php-del end flag */ // 既存の処理
※ignoreコメントで挟んだ箇所は削除対象から除外されるので残ります。
弊社以外にも需要があれば是非どうぞ、ということでOSSとして公開しています。
さいごに
今回OSSとしてComposerで配信するコマンドを作ってみて、次のようなことを感じました。
需要は自分たちだけのものでも良い
誰もが喜ぶライブラリじゃなくても、自分たちのニーズに答えられるものなら開発意欲も湧いて良いなと思いました。
他のOSSコードを読むようになる
他のOSSはこの処理どうやって実装してるんだろう?という疑問からPHPUnitやPHPStanなどの実装をチラ見したりしました。
普段あんまり見に行かないコードなのでそういうものに触れる機会にもなって良いと思います。
composer.jsonのbinに追加するだけでvendor/binに配置される仕組みめっちゃ良いです。
少しでもいいな、と思ったらぜひstarつけてください。