polidog lab++

Blog
依存関係でcomposerのインストールがうまく行かなかった場合の対処法

依存関係でcomposerのインストールがうまく行かなかった場合の対処法

Jan 10, 2014 | tech | composer php salesforce symfony2

こんばんは、最近またSymfony2やcomposerに触れる機会が増えてきた僕です。
さて、今日はcomposerでinstallやupdateしたら、ライブラリがメンテされてなくて依存関係でインストール出来なかった時の対処法をお教えします。

phpforce/salesforce-bundleをインストールしようとしたら、composerでこけたんですね。
原因としては、phpforce/salesforce-bundleのcomposer.jsonの中で、phpforce/soap-clientを指定してたんですが、そのphpforce/soap-clientのcomposer.jsonで指定してたdoctrine/commonの値が「2.3@stable」になってたからぽいです。

さらに、phpforce/soap-clientのcomposer.jsonでphpforce/commonが指定されているんですが、そのphpforce/commonのcomposer.jsonで symfony/event-dispatcher: >=2.1@stable指定されているからもう。。。。。

で、Symfony2.4 or 2.3の環境でインストールしようとするとエラーになりますね。つまりSymfony2.1じゃないとだめぽみたいな。。。
「satisfiable by phpforce/soap-client」みたいなメッセージが・・・

まあ今回みたいな事って大composeer時代となったら、多々あると思います。
で、今回の場合はどうしたのかってことですが、まあpull requestは送るのは当然だと思いますが、とりあず動かすために、ひたすら問題のあるライブラリをフォークして、直すってことをしました。

さらにこちらで使用するcomposer.jsonのrepositoriesで、forkしたgithubのリポジトリを指定するようなアプローチを行いました。

フォークしたライブラリ

https://github.com/polidog/common/tree/composer_edit
https://github.com/polidog/soap-client/tree/composer

フォークした二つのライブラリはcomposer.jsonの中身を変更しています。

フォークしたライブラリを利用するcomoposer.jsonの書き方

ポイントとしては2つあります。
1つ目は、repositoriesの部分ですね。
ここにフォークしたgithubのurlを貼付けましょう。

"repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/polidog/soap-client"
        },
        {
            "type": "vcs",
            "url": "https://github.com/polidog/common"
        }
    ],

2つ目は、通常であればrequireのしていには「”phpforce/salesforce-bundle”: “dev-master”」だけ記載すればいいのですが、forkしたphpforce/commonとphpforce/soap-clientを指定します。

"require": {
...
        "phpforce/common": "dev-composer_edit",
        "phpforce/soap-client": "dev-composer_edit",
        "phpforce/salesforce-bundle": "dev-master",

全体としては、こんな感じっす。

$ vim composer.json
{
    "name": "symfony/framework-standard-edition",
    "license": "MIT",
    "type": "project",
    "description": "The \"Symfony Standard Edition\" distribution",
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/polidog/soap-client"
        },
        {
            "type": "vcs",
            "url": "https://github.com/polidog/common"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/symfony": "~2.4",
        "doctrine/orm": "~2.2,>=2.2.3",
        "doctrine/doctrine-bundle": "~1.2",
        "twig/extensions": "~1.0",
        "symfony/assetic-bundle": "~2.3",
        "symfony/swiftmailer-bundle": "~2.3",
        "symfony/monolog-bundle": "~2.4",
        "sensio/distribution-bundle": "~2.3",
        "sensio/framework-extra-bundle": "~3.0",
        "sensio/generator-bundle": "~2.3",
        "incenteev/composer-parameter-handler": "~2.0",

        "phpforce/common": "dev-composer_edit",
        "phpforce/soap-client": "dev-composer_edit",
        "phpforce/salesforce-bundle": "dev-master",

        "guzzle/http": "v3.7.4"
    },
    "scripts": {
        "post-install-cmd": [
            "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
        ],
        "post-update-cmd": [
            "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
        ]
    },
    "config": {
        "bin-dir": "bin"
    },
    "extra": {
        "symfony-app-dir": "app",
        "symfony-web-dir": "web",
        "incenteev-parameters": {
            "file": "app/config/parameters.yml"
        },
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}

最後に

修正した箇所を、pull requestを送ったらちゃんとマージされてました!
https://github.com/phpforce/soap-client/pull/8
https://github.com/phpforce/common/pull/1

なので、今からphpforce/salesforce-bundleをSymfony2.4でインストールするならcomposer.jsonのrequireはphpforce/salesforce-bundleだけで大丈夫です。さらにrepositoriesの記述もいらないです。
以下のようにcomposer.json書けばいいと思います。

$ vim composer.json
{
    "name": "symfony/framework-standard-edition",
    "license": "MIT",
    "type": "project",
    "description": "The \"Symfony Standard Edition\" distribution",
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require": {
        "php": ">=5.3.3",
        "symfony/symfony": "~2.4",
        "doctrine/orm": "~2.2,>=2.2.3",
        "doctrine/doctrine-bundle": "~1.2",
        "twig/extensions": "~1.0",
        "symfony/assetic-bundle": "~2.3",
        "symfony/swiftmailer-bundle": "~2.3",
        "symfony/monolog-bundle": "~2.4",
        "sensio/distribution-bundle": "~2.3",
        "sensio/framework-extra-bundle": "~3.0",
        "sensio/generator-bundle": "~2.3",
        "incenteev/composer-parameter-handler": "~2.0",
        "phpforce/salesforce-bundle": "dev-master",
        "guzzle/http": "v3.7.4"
    },
    "scripts": {
        "post-install-cmd": [
            "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
        ],
        "post-update-cmd": [
            "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
        ]
    },
    "config": {
        "bin-dir": "bin"
    },
    "extra": {
        "symfony-app-dir": "app",
        "symfony-web-dir": "web",
        "incenteev-parameters": {
            "file": "app/config/parameters.yml"
        },
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}

最後の最後に、、、

業務中にpull request送ってごめんなさい・・・だってライブラリ1から作るのめんどくさいし工数掛かっちゃうんだもん・・・(´・ω・`)

comments powered by Disqus

関連記事

© 2017 polidog lab++