PHPコードを消すライブラリを作った

f:id:kubotak:20211207104943p:plain この記事はQiita AdventCalendar 2021 PHPの8日目の記事です。

こんにちは、こんばんわ、kubotak(@kubotak_public)です。
早速ですがタイトルの通り「PHPコードを消すライブラリ」を作りました。

packagist.org

まずはこのライブラリの生まれた背景と用途について説明します。もしよければ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つけてください。