Change record status: 
Introduced in branch: 
3.0.x
Introduced in version: 
Description: 

Package Manager's ComposerUtility used to rely on parsing internal data structures of Composer. That made a long-term risk. in It also relied on the composer/composer package to make this reasonably maintainable, but that in turn was a blocker for Drupal core inclusion.

ComposerInspector has been introduced as the successor and provides equivalent functionality, but relies solely on calling composer itself — it's a PHP wrapper to facilitate interacting with composer and with it you can:

  • list installed packages: getInstalledPackagesList() (composer show)
  • validate composer state & project: validate() (composer validate)
  • read project & package configuration: getConfig() (composer config)
  • read root package info: getRootPackageInfo() (composer show --self)

This also allowed the Package Manager module to remove its (runtime) dependency on the composer/composer package, which was a prerequisite for Drupal core inclusion.

See the myriad of "use ComposerInspector instead of ComposerUtility" child issues of #3316368: Remove our runtime dependency on composer/composer: remove ComposerUtility for examples.

Updating code to stop using Stage::getActiveComposer() and Stage::getStageComposer()

  1. Enable autowiring in your *.services.yml file:
  2. Make sure your validator or excluder that used either of those methods has a constructor that is a superset of this:
      /**
       * Constructs an <MYVALIDATOR> object.
       *
       * @param \Drupal\package_manager\ComposerInspector $composerInspector
       *   The Composer inspector service.
       * @param \Drupal\package_manager\PathLocator $pathLocator
       *   The path locator service.
       */
      public function __construct(
        private ComposerInspector $composerInspector,
        private PathLocator $pathLocator
      ) {}
    
  3. Update code like
    $event->stage->getActiveComposer()->getInstalledPackages();
    

    to

    $this->composerInspector->getInstalledPackagesList($this->pathLocator->getProjectRoot());
    
  4. Update code like
    $event->stage->getStageComposer()->getInstalledPackages();
    

    to

    $this->composerInspector->getInstalledPackagesList($event->stage->getStageDirectory())
    
Impacts: 
Module developers