AppEngineでcomposerが更新されないとき

Google AppEngine

 最近になってようやく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パッケージもインストールしなおしてからデプロイされるようになります。

最近作ったアプリの話

先日、コナミ社の提供している コナステ のダウンロードコンテンツゲームを1クリックで起動できるアプリを作り、公開した。 Ks Game Launcher  ( Github ) 作った理由として、インストール時に作成されたショートカットをクリックするとブラウザが起動し、ログインし...