Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Composer php 如何从";取消编写器更新操作;“包装前更新”;听众_Composer Php - Fatal编程技术网

Composer php 如何从";取消编写器更新操作;“包装前更新”;听众

Composer php 如何从";取消编写器更新操作;“包装前更新”;听众,composer-php,Composer Php,正在开发一个小型Composer插件,它有一个用于包前更新事件的侦听器 public function prePackageUpdate(PackageEvent $event): void { /** @var UpdateOperation $operation */ $operation = $event->getOperation(); if ($something) { // I would like the stop the updat

正在开发一个小型Composer插件,它有一个用于
包前更新
事件的侦听器

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

    if ($something) {
        // I would like the stop the update for this package...
    }
}
基于某些逻辑,我希望包不被更新,但我找不到任何方法来做到这一点。。。有吗

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

基于以下内容回答我自己的问题

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

不过,取消整个过程确实是可能的,只需抛出一个异常即可

但是,从
包前更新
侦听器引发异常可能会使供应商处于某种不一致的状态。更好的方法是在
后依赖项解决
侦听器中,在那里根本没有执行任何操作

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