如何从 "pre-package-update" 侦听器取消作曲家更新操作

How to cancel the composer update operation from a "pre-package-update" listener

正在开发一个小型 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...
    }
}

根据某些逻辑,我希望 更新软件包,但我找不到任何方法来做到这一点...有吗?

理想情况下,我希望命令(安装或更新)继续使用其他软件包,但如果这不可能,则取消并还原整个过程也没关系。

根据this issue I cross-posted on GitHub回答我自己的问题。

可以理解,取消特定操作是不可能的。 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!');
        }
    }
}