Как развернуть PHP7 с MongoDB ext на Heroku?

Я пытаюсь развернуть приложение на Heroku и сталкиваюсь с проблемами, связанными с конфликтом зависимостей композитора. Он работает нормально с моей локальной машины разработчика, я могу composer update без проблем.

Вот образец моего 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"
},

... и вот вывод ошибки от 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

1 ответ

Решение

Это большая проблема. Давайте разделим это на две части:

Часть 1:

Ext-mongo - это устаревший драйвер, который не существует для PHP7.x. Но Doctrine-ODM требует ext-mongo. Обходной путь должен использовать адаптер, который обеспечивает интерфейс для старого драйвера, который использует новый драйвер MongoDB. В документации Doctrine-ODM есть объяснение, но это объяснение не является актуальным и, следовательно, неполным / неправильным.

В вашем случае это означает, что вы удалите "ext-mongo" а также "ext-mongodb" от "require" раздел вашего файла композитора и сохранить "alcaeus/mongo-php-adapter" (Адаптер потребует сам "ext-mongodb" - новый драйвер.) К сожалению, это все еще не сработает и приведет нас ко второй части.

Часть 2:

Интеграция alcaeus/mongo-php-adapter, как это в настоящее время предоставляется Packagist, создаст конфликт зависимостей композитора. Существует некоторое обсуждение именно этой проблемы, а также, если это может быть общая проблема композитора ( см. Здесь). Также предлагается несколько решений. Одно решение работает для меня (я также развернул на Heroku):

В composer.json для alcaeus/mongo-php-adapter заменить:

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

от:

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

В GitHub основная ветвь alcaeus/mongo-php-adapter использует версию "обеспечить", но есть также ветка composer-replace, которая использует версию "replace". К сожалению, эта ветка не обновляется.

Вы можете использовать эту ветвь "замена" в качестве хранилища для alcaeus/mongo-php-adapter в вашем файле композитора:

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

В качестве альтернативы вы можете разветвлять основную ветку, заменить "обеспечить" на "заменить" и использовать эту ветвь в качестве репозитория.

Другие вопросы по тегам