Как вернуть обратно обновление композитора?

Сегодня я побежал composer update, и обновление полностью сломало мой сайт. Я нашел в php.log следующую информацию:

72.15.153.139 - - [11/Ноябрь/2015: 21: 01: 45 -0500] "GET/HTTP/1.1" 500 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv: 42.0) Gecko/20100101 Firefox/42.0" [Wed Nov 11 21:01:48 2015] [error] [клиент 127.7.179.129] Ошибка PHP-анализа: синтаксическая ошибка, неожиданная "функция" (T_FUNCTION), ожидающая идентификатор (T_STRING) или \\(T_NS_SEPARATOR) в/var/lib/openshift/55c481747628e14556000188/app-root/runtime/repo/config/vendor/danielstjules/stringy/tests/CreateTest.php в строке 5 "GET/HTTP/1.1" 500 - "-" "Mozilla/5.0 (Windows NT 6.1, WOW64; rv: 42.0) Gecko/20100101 -" [11/Ноябрь/2015: 21: 01: 48 -0500] Firefox/42,0"

Похоже, что виноват "danielstjules/stringy". Но как я могу вернуться к старой версии (или с помощью новостной версии?) Этого пакета? Я попытался изменить файл composer.lock и изменил

            "require": {
            "danielstjules/stringy": "~1.8",

to

        "require": {
            "danielstjules/stringy": "~1.9",

и снова запустите composer update, но он предоставил информацию:

Загрузка репозиториев композитора с информацией о пакете Обновление зависимостей (включая require-dev) Ничего не устанавливать или обновлять Запись файла блокировки Создание файлов автозагрузки Ошибка PHP Parse: синтаксическая ошибка, неожиданные "функции" (T_FUNCTION), ожидающий идентификатор (T_STRING) или \(T_NS_SEPARATOR) в/var/lib/openshift/55c481747628e14556000188/app-root/runtime/repo/config/vendor/danielstjules/stringy/tests/CreateTest.php в строке 5 Script php artisan с явным компилятором обрабатывает событие post-update-cmd, возвращенное с ошибкой

[RuntimeException]   Ошибка: ошибка PHP Parse: синтаксическая ошибка, неожиданная функция (T_FUNC   TION), ожидая идентификатор (T_STRING) или \(T_NS_SEPARATOR) в/var/lib/o   penshift/55c481747628e14556000188/приложение корневой/выполнение/репо/конфигурация/поставщик/Danie   lstjules/stringy/tests/CreateTest.php в строке 5

Как я могу отменить этот пакет? Спасибо.

ИЗМЕНИТЬ 2:

composer install автоматически изменит composer.lock. Вместо этого я изменил composer.json, и он успешно использовал старую версию 1.8.

Но сборка все еще не удалась. Это описание проблемы было причиной. Но после я rm -rf test/ проблема все еще была.

ИЗМЕНИТЬ 3:

Я попробовал следующее:

  • rm -rf vendor/
  • composer update

Проблема исчезла.

Ответ 1

Если вы проверите документацию спецификации версии композитора, оператор ~ получает последнюю версию, обратно совместимую в соответствии с принципами семантического контроля версий. Это означает, что ~1.8 эквивалентно >=1.8 <2.0.0 и аналогично ~1.9 соответствует >=1.9 <2.0.0. Другими словами, ~1.8 вернет ЖЕ ВЕЩЬ как ~1.9 если последняя версия >=1.9. Если вы действительно хотите использовать версию 1.8, просто сделайте это:

"danielstjules/stringy": "1.8",

Это получит ТОЧНО версию 1.8. Конечно, вам нужно будет запустить composer update позже.

Я нахожу синтаксис управления версиями композитора запоминающимся.

Ответ 2

Как вернуть обновление? Easy: Восстановите файл composer.lock из вашей системы контроля версий, которая была использована до вашего обновления.

composer.lock точно записывает, какое программное обеспечение было установлено. Поэтому важно перенести этот файл в систему управления версиями, чтобы иметь возможность вернуться к рабочей версии в случае сбоя обновления.

Запуск composer install всегда будет устанавливать версии программного обеспечения, записанные в composer.lock, он будет действовать только как update, если этого файла нет.

Ответ 3

Восстановить composer.lock не правильный ответ. Потому что, если вы сделаете это, чтобы "отменить" последнюю команду Composer UPDATE, для файла composer.json (не для файла .LOCK) по-прежнему будет требоваться обновление версии до.

Пример: файл .JSON перед обновлением Composer (который вы хотите затем попробовать и ОТМЕНИТЬ.):

"require": {
        "drupal/moduleX": "^1.6"
}

Файл .JSON после команды обновления Composer:

"require": {
        "drupal/moduleX": "^1.8"
}

Предполагая, что вы даже думали сохранить резервную копию, восстановив только старую версию файла .LOCK и запустив composer install --no-dev сделает DOWNGRADE; но ваш файл .JSON все еще находится по адресу:

"require": {
        "drupal/moduleX": "^1.8"
}

Таким образом, последующие установки этого модуля - или модулей, у которых модульX является зависимостью - завершатся неудачно, потому что модуль X заблокирован в версии 1.6 (в файле LOCK); но требуется (в файле .JSON) в v1.8.

Кроме того, он не откатывает только установку ОДНОГО модуля, он откатывает ВСЕ модули, которые были обновлены; или даже те, которые вы удалили. Деинсталлированные модули, затем переустановленные с восстановлением файла .LOCK, также не добавляются обратно в файл .JSON.

Если вы используете контроль версий, возможно, git reset --hard. Фиксируйте рано и часто.