Как вернуть обратно обновление композитора?
Сегодня я побежал 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
. Фиксируйте рано и часто.