[php]本当は怖いcomposer (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などで教えていただけると幸いです。
カテゴリ:
PHP