現象
composer update --no-dev
をするとcomposer.jsonのrequire-devはロードされない。
しかし、Laravelのconifg/app.phpでaliases/providersに登録しているとcomposer updateが失敗してしまう。
特にLaravelではLaravelDebugBarがよく使われており、このパッケージはproduction環境では必要ないため、requre-devに設定されることが多い。すると上記コマンドでは
(Class 'Barryvdh\Debugbar\ServiceProvider' not found)
とエラーメッセージが出てしまう。
気にせずcomposer updateをすれば、成功はするのだが、不必要なパッケージまでデプロイするべきではない。
以下では2つの方法で上記の現象を解消したので紹介する。
対処法
1. config/app.php内で切り分ける
config/app.phpは以下のように記述されている
<?php
return [
~~~~~~
'providers' => [
'Illuminate\Auth\AuthServiceProvider',
....
],
'aliases' => [
'App' => 'Illuminate\Support\Facades\App',
....
]
];
なので、一旦return されているものを tmp とし、env('APP_ENV')がlocalの場合追加してあげれば良い。
以下のようなコードになる
<?php
$tmp = [
~~~~~~
'providers' => [
'Illuminate\Auth\AuthServiceProvider',
....
],
'aliases' => [
'App' => 'Illuminate\Support\Facades\App',
....
]
];
if (env('APP_ENV') == 'local') {
$tmp['providers'][] = 'Barryvdh\Debugbar\ServiceProvider';
$tmp['aliases']['Debugbar'] = 'Barryvdh\Debugbar\Facade';
}
return $tmp;
これで動くは動くがなんかLaravelらしくない。
2.serviceproviderを作る
1の方法で実装していたが、serviceproviderで実装する方法があったので実装した。
http://blog.piotrows.pl/en/laravel-5-load-serviceprovider-depend-on-env-file/
リンク先のFinal ServiceProvider codeと同じため(コメントの一部を日本語化したぐらい)のためここにはコードはアップしない。
gistには参考までにupしてある。
https://gist.github.com/ytacky/b5aca6598ca1770a92f6
気をつけることは、config/app.phpのproviderに
'App\Providers\LocalEnviromentServiceProvider',
を追加すること
まとめ
LaravelDebugBarを紹介している記事ではほぼconifg/app.phpでaliases/providersの設定をしている。個人用のプログラムで本番環境に不要なパッケージがデプロイされても特に問題ないならば、その実装方法でも問題ない。基本的には composer update --no-devしてdev環境以外でいらないパッケージはデプロイしないようにしたほうがいい。