如何从 "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!');
}
}
}
正在开发一个小型 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!');
}
}
}