タグ: Composer

PHPアプリケーションをHerokuにデプロイするときに”ERROR: Couldn’t parse ‘composer.lock’; it must be a valid lock”エラー

PHPアプリケーションをHerokuにデプロイしようと思い、

git push heroku master

としたところ

-----> PHP app detected
-----> Bootstrapping...
-----> Installing platform packages...
 ! ERROR: Couldn't parse 'composer.lock'; it must be a valid lock
  file generated by Composer. Run 'composer update', add/commit
  the change, then push again.
 ! Push rejected, failed to compile PHP app.
 ! Push failed

となりデプロイが失敗。

composer.lockは存在しており、指示通りcomposer updateをしてcomposer.jsoncomposer.lockを更新したうえでデプロイしても同じエラーが発生しました。

php – Heroku ERROR: Failed parsing composer.lock; it must be non-empty and valid JSON – Stack Overflow

より

composer self-updateでcomposer自体を更新し、composer updateしたうえで、デプロイすることでエラーが出なくなりデプロイできました。

広告

開発環境と本番環境のPHPバージョンが違う状況で本番環境でcomposer installをした際にエラー

前提

  • 使用フレームワークはFuelPHP
  • 開発環境はPHP5.5.9(Vagrant&Docker)、本番環境はPHP5.4.45(さくらのレンタルサーバ)
  • サードパーティライブラリはcomposerを使用、composer.json,composer.lockをバージョン管理に含めている
  • デプロイサーバがあり、そこからデプロイができるようになっている
  • デプロイはデプロイサーバでgit pullしたものをrsyncで本番サーバに配布、その後本番サーバ上でcomposer installでサードパーティライブラリをインストールする手順

状況

composer.jsonのrequireに指定されている、nesbot/carbonに依存しているsymfony/translationがv3.0.0にバージョンアップした結果、PHPが5.5.9以上を要求されるようになった。

開発環境でcomposer instalやupdateをし、生成されたlockファイルをリポジトリに含めているため、デプロイでcomposer installを行うとlockファイルに記述されているバージョンを使用してインストールを行う
その結果以下のようなエラーとなった

Installing dependencies (including require-dev) from lock file
Your requirements could not be resolved to an installable set of packages.
 Problem 1
   - Installation request for symfony/translation v3.0.0 -> satisfiable by symfony/translation[v3.0.0].
   - symfony/translation v3.0.0 requires php >=5.5.9 -> your PHP version (5.4.45) or "config.platform.php" value does not satisfy that requirement.
 Problem 2
   - Installation request for symfony/console v3.0.0 -> satisfiable by symfony/console[v3.0.0].
   - symfony/console v3.0.0 requires php >=5.5.9 -> your PHP version (5.4.45) or "config.platform.php" value does not satisfy that requirement.
 Problem 3
   - Installation request for symfony/yaml v3.0.0 -> satisfiable by symfony/yaml[v3.0.0].
   - symfony/yaml v3.0.0 requires php >=5.5.9 -> your PHP version (5.4.45) or "config.platform.php" value does not satisfy that requirement.
 Problem 4
   - symfony/translation v3.0.0 requires php >=5.5.9 -> your PHP version (5.4.45) or "config.platform.php" value does not satisfy that requirement.
   - nesbot/carbon 1.21.0 requires symfony/translation ~2.6|~3.0 -> satisfiable by symfony/translation[v3.0.0].
   - Installation request for nesbot/carbon 1.21.0 -> satisfiable by nesbot/carbon[1.21.0].

一方、本番サーバー上でlockファイルを削除したのちcomposer installを行うとPHP5.4.45に対応しているsymfony/translationのv2.8.0がインストールされるため正常に終了できる。

解決

開発と本番でPHPのバージョンを合わせる以外の方法として、

PHP – あんまり知られてないけど有用な composer の機能 – Qiitaより、

開発環境側で、composer.jsonのconfig部分に

  "config": {
    "platform": {
        "php": "5.4.45"
    }
  }

とplatform.phpキーを追加し、本番環境のPHPバージョンを記述することで、開発環境でもcomposerで導入されるサードパーティのバージョンがPHP5.4.45に合わせたものになる。
composer updateしてcomposer.lockを更新したのち、composer.json,composer.lockをコミットして、同じようにデプロイ手順を行った結果正常にデプロイできました。

FuelPHP+Authパッケージ&Opauthでopauth/facebookのforkしたものを使う

FuelPHP上で認証機能を実装するために、Authパッケージ+Opauthドライバを利用する。

  1. はじめに – Opauth – Auth Package – FuelPHP Documentationを参考に、composerでopauth/opauth,opauth/facebookパッケージをインストール
  2. Opauth Controller example – Auth Package – FuelPHP Documentationを参考に、Authコントローラーを作成
  3. 開発者向けFacebookでFacebookアプリを作成
  4. fuel/app/config/opauth.phpを作成して
    return array(
        'Strategy' => array(
            'Facebook' => array(
                'app_id' => 'App ID',
                'app_secret' => 'App Secret',
                'scope' => array('email')
            ),
        )
    );

としてログイン画面を作成しましたが、Facebookからのコールバックでパラメータからメールアドレスが取得できませんでした。
これは、FacebookAPIの仕様変更によるもので、対応するにはopauth/facebook内のコードを編集する必要があります。

今回は、opauth/facebook内のコードを直接編集するのではなく、opauth/facebookをForkしてFacebook APIに対応したリポジトリを利用します。
リポジトリの選択は、「Network Graph · opauth/facebookから、オリジナルの最先端にある1.0ブランチから派生しているもので、派生先のmasterブランチに修正がコミットされたのが最近のもの」として、TippingCanoe/facebookを利用することにしました。

  1. composer.jsonを編集して
    repositoriesに

       { "type": "vcs", "url": "https://github.com/TippingCanoe/facebook" }
    

    を追加
    requireのopauth/facebookを

      "opauth/facebook": "dev-master"
    

    に変更したのち、composer updateを実行

  2. fuel/vendor/opauth/facebook/FacebookStrategy.phpを開いて、
    https://github.com/TippingCanoe/facebook/commit/3624b3043bf1ca5b87294aace7fd4df20ee2f8e4#diff-d286e64409257a85e4a8ea5c5f295e48
    の修正が適用されているかを確認

参考