[php]本当は怖いcomposer (require-devの落とし穴について)

composer.jsonの"require-dev"という仕組みには落とし穴があります。
使うときは十分気をつけましょう。

そもそも"require-dev"とは何か?

本番環境で必要のない開発環境用のパッケージを記述する場合に使います。
{
  "require": {
    "symfony/http-foundation": "2.4.*",
  },
  "require-dev": {
    "phpunit/phpunit": "3.7.*"
  }
}
例えばこのように記述すると、本番では"http-foundation"のみを使い、開発環境ではそれに加えて"phpunit"も使う、というようなことが可能になります。

うっかり"require-dev"パッケージを呼び出すコードを書いてしまうと事故になる。

例えばプロジェクトでYAMLファイルを扱いたいと思って"symfony/yaml"を呼び出すコードを書いたとします。
use Symfony\Component\Yaml\Yaml;

$array = Yaml::parse($file);
このコードは開発環境ではバッチリ動いてしまいます。 なぜなら、phpunitが"symfony/yaml"に依存してるので、phpunitをインストールすると芋づる式に"symfony/yaml"が入るからです。

ところがこのプロジェクトを本番環境にデプロイすると、本番では"symfony/yaml"がインストールされていないために"Fatal Error"が発生してしまいます。

対処方法

根本解決が難しいのですが、
対策1:本番環境でも"composer install --dev"してrequire-devパッケージを入れてしまう
  • メリット:上記のような事故がおきない
  • デメリット:本番環境に無駄にパッケージを入れることになる。(インストール時間が長くなる、ディスク容量の無駄、等)
対策2:本番環境で、パッケージの存在有無をチェックするテストスクリプトを走らせる
  • メリット:本番にrequire-devを入れなくて済む。
  • デメリット:テストスクリプトの作成忘れ、実行忘れを防げない
対策3:開発者が気をつける
これはダメなやつや・・

PHPプログラマのみなさんはどうされているのでしょうか?
「自分はこうしてる」などの事例があればTwitterなどで教えていただけると幸いです。
カテゴリ: