最近になってようやくGoogle AppEngine (以下GAE)を使いだし、自サイトをその上で動かせるよう試行錯誤しています。
前置き
私の主サイトは古くからPHPで動かしていて(初期の頃はLegacy ASPで動かしていたこともありました)、GAEでPHPがサポートされてからいつか移植して動かしてみたい。と思っていたのですが、ベースとしていたフレームワークが古く、composerも使用していない状態のものだったため、最近になり、重い腰を上げてLaravelに置き換えるまでなかなか移植できずにいました。
GAEで開発していると、自分で好き勝手にモジュールをインストールして動かしていた環境と異なり、ある程度の制約を受けつつその中で作るようになります。幸いにも既存機能については代替の外部APIなどに置き換える事でほとんど移植可能になりそうとなりました。
本題
前置きが長くなりましたが、開発している中で、composerでインストールしたパッケージが、GAE上では何故かインストールされないことがありました。
具体定期には、GAEは実質Dockerコンテナなので、永続的なファイル管理はできません。そこで、内部で使用するストレージ部分はGoogle Cloud Storageに置き換えようと思い、google/cloud-storageを使用して通信する処理に置き換えるなどしたのですが、何度デプロイしてもこのパッケージがデプロイされず、参照できずにエラーとなっていました。
デプロイコマンド
GAEでデプロイする際は、通常下記のコマンドを使用します。
gcloud app deploy
または
gcloud app --project <project_id> deploy
基本的には上記でコードをデプロイできますが、composer取得などを毎回行うとビルドに時間がかかるため、composerのパッケージ取得は内部でキャッシュしているそうです。
このキャッシュが強く残り、composer.jsonとcomposer.lockが更新されていても、パッケージがインストールされていなかったようです。
デプロイ時にcomposerを更新させるには下記のコマンドで実行します。
gcloud beta app deploy --no-cache
これにより、デプロイ時ビルドでキャッシュを使用せず、composerパッケージもインストールしなおしてからデプロイされるようになります。