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()
- Enable autowiring in your
*.services.ymlfile: - 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 ) {} - Update code like
$event->stage->getActiveComposer()->getInstalledPackages();to
$this->composerInspector->getInstalledPackagesList($this->pathLocator->getProjectRoot()); - Update code like
$event->stage->getStageComposer()->getInstalledPackages();to
$this->composerInspector->getInstalledPackagesList($event->stage->getStageDirectory())