Как отменить операцию обновления composer из прослушивателя «pre-package-update» - PullRequest
5 голосов
/ 25 февраля 2020

Работает над небольшим плагином Composer, в котором есть прослушиватель для события pre-package-update.

public function prePackageUpdate(PackageEvent $event): void
{
    /** @var UpdateOperation $operation */
    $operation = $event->getOperation();

    if ($something) {
        // I would like the stop the update for this package...
    }
}

Основываясь на некоторых логиках c, я бы хотел, чтобы пакет не быть обновленным, но я не могу найти способ сделать это ... Есть ли один?

В идеале я бы хотел, чтобы команда (либо установила, либо обновила) продолжила работу с другими пакетами, но если это невозможно, это нормально, если весь процесс отменен и отменен.

1 Ответ

0 голосов
/ 12 марта 2020

Отвечая на мой собственный вопрос, основанный на этой проблеме, я кросс-постил на GitHub .

Понятно, что отмена указанной операции c невозможна. Composer выполняет процесс решения зависимостей и предлагает набор выполняемых операций, которые потенциально взаимозависимы, поэтому пропуск одной из них может повлиять на другие (например, если вы отмените обновление пакета, версии, выбранные для обновление других пакетов может потребоваться по-другому), поэтому потребуется новый процесс решения зависимостей.

Отмена всего процесса действительно возможна, хотя и может быть осуществлена ​​путем простого исключения.

Однако, исключение из прослушивателя pre-package-update может оставить поставщика в несколько несовместимом состоянии. Лучшее место для этого - слушатель post-dependencies-solving, где операции вообще не выполнялись.

public function postDependenciesSolving(InstallerEvent $event)
{
    foreach ($event->getOperations() as $operation) {
        if ($something) {
            throw new Exception('Whole process cancelled and reverted!');
        }
    }
}
...