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



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

基于某些逻辑,我希望而不是的包被更新,但我找不到任何方法来做到这一点。。。有吗?

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

基于这个问题回答了我自己的问题,我在GitHub上交叉发布了这个问题

可以理解,取消特定操作是不可能的。Composer执行依赖关系解决过程,并提出一组要执行的操作,这些操作可能是相互依赖的,因此跳过其中一个操作可能会影响其他操作(例如,如果取消更新包,则选择用于更新其他包的版本可能需要不同(,因此需要新的依赖关系解决程序。

不过,取消整个过程确实是可能的,并且可以通过简单地抛出异常来完成。

但是,从pre-package-update侦听器抛出Exception可能会使供应商处于某种不一致的状态。一个更好的地方是在post-dependencies-solving侦听器中,那里根本没有执行任何操作。

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

最新更新