2017-05-01 1 views
1

J'essaye de déployer une application sur Heroku et je suis confronté à des problèmes liés aux dépendances de compositeurs conflictuelles. Cela fonctionne bien de ma machine de développement locale, je peux composer update sans aucun problème.Comment déployer PHP7 avec MongoDB ext sur Heroku?

Voici un échantillon de mon composer.json:

"require": { 
    "php": "7.1.*", 
    "ext-mongo": "*", 
    "ext-mongodb": "^1.2", 
    "symfony/symfony": "3.2.*", 
    "doctrine/orm": "^2.5", 
    "doctrine/doctrine-bundle": "^1.6", 
    "doctrine/doctrine-cache-bundle": "^1.2", 
    "symfony/swiftmailer-bundle": "^2.3.10", 
    "symfony/monolog-bundle": "^3.0.2", 
    "symfony/polyfill-apcu": "^1.0", 
    "sensio/distribution-bundle": "^5.0", 
    "sensio/framework-extra-bundle": "^3.0.2", 
    "incenteev/composer-parameter-handler": "^2.0", 
    "twig/twig": "^1.0||^2.0", 
    "mongodb/mongodb": "^1.1", 
    "doctrine/mongodb-odm-bundle": "^3.2", 
    "alcaeus/mongo-php-adapter": "^1.0", 
    "friendsofsymfony/user-bundle": "2.0.0-beta2", 
    "friendsofsymfony/oauth-server-bundle": "^1.5", 
    "symfony/assetic-bundle": "^2.8", 
    "twig/extensions": "^1.4", 
    "jms/serializer-bundle": "^1.2", 
    "friendsofsymfony/rest-bundle": "^2.1" 
}, 

... et voici la sortie d'erreur de Heroku:

> Loading repositories with available runtimes and extensions 
> Updating dependencies 
> Your requirements could not be resolved to an installable set of packages. 
> 
> Problem 1 
>  - Installation request for doctrine/annotations v1.4.0 -> satisfiable by doctrine/annotations[v1.4.0]. 
>  - Installation request for twig/twig v2.3.2 -> satisfiable by twig/twig[v2.3.2]. 
>  - Conclusion: don't install php 7.1.3 
>  - Installation request for doctrine/mongodb 1.4.0 -> satisfiable by doctrine/mongodb[1.4.0]. 
>  - doctrine/annotations v1.4.0 requires php ^5.6 || ^7.0 -> satisfiable by php[5.6.30, 7.0.15, 7.0.16, 7.0.17, 7.1.1, 7.1.2, 7.1.3]. 
>  - don't install php 7.1.1|don't install php 5.5.38 
>  - don't install php 7.1.2|don't install php 5.5.38 
>  - don't install php 7.0.15|don't install php 5.5.38 
>  - don't install php 7.0.16|don't install php 5.5.38 
>  - don't install php 7.0.17|don't install php 5.5.38 
>   - ext-mongo 1.6.14 requires php 5.5.* -> satisfiable by php[5.5.38]. 
>  - doctrine/mongodb 1.4.0 requires ext-mongo ^1.5 -> satisfiable by ext-mongo[1.6.14]. 
>  - ext-mongo 1.6.14 requires php 5.6.* -> satisfiable by php[5.6.30]. 
>  - Conclusion: don't install php 5.6.30 

Répondre

3

Ceci est un problème plus grave. Divisons en deux parties:

Partie 1:

Ext-mongo est un legacy driver qui n'existe pas pour PHP7.x. Mais Doctrine-ODM nécessite ext-mongo. La solution de contournement consiste à utiliser un adaptateur qui fournit une interface pour l'ancien pilote qui utilise le nouveau MongoDB driver. Il y a une explication dans le Doctrine-ODM documentation, mais cette explication n'est pas à jour et donc incomplète/incorrecte.

Dans votre cas, cela signifie que vous retirez "ext-mongo" et "ext-mongodb" de la section "require" de votre fichier compositeur et garder le "alcaeus/mongo-php-adapter" (L'adaptateur lui-même besoin "ext-mongodb" -. Le nouveau pilote) Malheureusement, cela fonctionne toujours pas et nous amène à la partie 2.

Partie 2:

l'intégration du Alcée/mongo-php-adaptateur comme il est actuellement assurée par Packagist créera un conflit de dépendance du compositeur. Il y a une discussion à propos de exactly this problem et aussi si cela peut être un problème général de compositeur (see here). En outre, plusieurs solutions sont suggérées. One solution fonctionne pour moi (je suis aussi sur le déploiement Heroku):

Dans le composer.json du Alcée/mongo-php-adaptateur remplacer:

"provide": { 
    "ext-mongo": "1.6.14" 
}, 

par:

"replace": { 
    "ext-mongo": "1.6.14" 
}, 

Sur GitHub, le master branch of alcaeus/mongo-php-adapter utilise la version "provide", mais il existe également une branche composer-replace qui utilise la version "replace". Malheureusement, cette branche n'est pas tenue à jour.

Vous pouvez l'utiliser « remplacer » branche comme référentiel pour Alcée/mongo-php-adaptateur dans votre fichier compositeur:

"repositories": [ 
     { 
      "type": "vcs", 
      "url": "https://github.com/alcaeus/mongo-php-adapter" 
     } 
    ], 
"require": { 
    "alcaeus/mongo-php-adapter": "dev-composer-replace", 
    ... 

Sinon, vous pouvez bifurquer la branche principale, remplacer « fournir » par "replace" et utilise cette fourchette comme référentiel.