Skip to content

Fatal error when installing WP-CLI Doctor package #247

@GaryJones

Description

@GaryJones

Problem/Motivation

Globally installing a WP-CLI package, Doctor, results in a Type Error within dealerdirect/phpcodesniffer-composer-installer.

At the very least, this fatal error could probably be checked for and handled more gracefully.

cc @schlessera @swissspidy in case the issue lies in Doctor / WP-CLI.

Expected behaviour

Running wp package install wp-cli/doctor-command:@stable should install cleanly. Inside my local dev environment, where there's no PHPCS-related packages installed, it works fine.

Actual behaviour

On my local host machine, where there's also a global Composer install of PHPCS packages, I get a fatal error.

Full stack trace:
$ wp package install wp-cli/doctor-command:@stable
Installing package wp-cli/doctor-command (@stable)
Updating /Users/gary/.wp-cli/packages/composer.json to require the package...
PHP Deprecated:  Return type of Symfony\Component\Finder\Finder::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/wp/vendor/symfony/finder/Finder.php on line 566

{snip of multiple deprecation warnings like the above - https://github.com/wp-cli/package-command/issues/192}

Using Composer to install the package...
---
Loading composer repositories with package information
Found 332 package versions referenced in your dependency graph. 193 (58%) were optimized away.
Updating dependencies
Generating rules
Resolving dependencies through SAT
Looking at all rules.
Something's changed, looking at all rules again (pass #1)

Dependency resolution completed in 0.000 seconds
Analyzed 139 packages to resolve dependencies
Analyzed 179 rules to resolve dependencies
Nothing to modify in lock file
Installing dependencies from lock file
Nothing to install, update or remove
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!
PHP Fatal error:  Uncaught TypeError: Composer\Installer\InstallationManager::getInstallPath(): Argument #1 ($package) must be of type Composer\Package\PackageInterface, null given, called in /Users/gary/.composer/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php on line 558 and defined in phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/Installer/InstallationManager.php:614
Stack trace:
#0 /Users/gary/.composer/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php(558): Composer\Installer\InstallationManager->getInstallPath(NULL)
#1 /Users/gary/.composer/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php(358): PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin->getPHPCodeSnifferInstallPath()
#2 /Users/gary/.composer/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php(238): PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin->getPhpcsCommand()
#3 /Users/gary/.composer/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php(193): PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin->loadInstalledPaths()
#4 [internal function]: PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin->onDependenciesChangedEvent(Object(Composer\Script\Event))
#5 phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php(192): call_user_func(Array, Object(Composer\Script\Event))
#6 phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php(119): Composer\EventDispatcher\EventDispatcher->doDispatch(Object(Composer\Script\Event))
#7 phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/Installer.php(372): Composer\EventDispatcher\EventDispatcher->dispatchScript('post-update-cmd', false)
#8 phar:///usr/local/bin/wp/vendor/wp-cli/package-command/src/Package_Command.php(398): Composer\Installer->run()
#9 [internal function]: Package_Command->install(Array, Array)
#10 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Dispatcher/CommandFactory.php(100): call_user_func(Array, Array, Array)
#11 [internal function]: WP_CLI\Dispatcher\CommandFactory::WP_CLI\Dispatcher\{closure}(Array, Array)
#12 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Dispatcher/Subcommand.php(497): call_user_func(Object(Closure), Array, Array)
#13 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(470): WP_CLI\Dispatcher\Subcommand->invoke(Array, Array, Array)
#14 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(493): WP_CLI\Runner->run_command(Array, Array)
#15 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(136): WP_CLI\Runner->run_command_and_exit()
#16 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(1228): WP_CLI\Runner->do_early_invoke('before_wp_load')
#17 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Bootstrap/LaunchRunner.php(28): WP_CLI\Runner->start()
#18 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/bootstrap.php(84): WP_CLI\Bootstrap\LaunchRunner->process(Object(WP_CLI\Bootstrap\BootstrapState))
#19 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/wp-cli.php(35): WP_CLI\bootstrap()
#20 phar:///usr/local/bin/wp/php/boot-phar.php(20): include('phar:///usr/loc...')
#21 /usr/local/bin/wp(4): include('phar:///usr/loc...')
#22 {main}
  thrown in phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/Installer/InstallationManager.php on line 614

Fatal error: Uncaught TypeError: Composer\Installer\InstallationManager::getInstallPath(): Argument #1 ($package) must be of type Composer\Package\PackageInterface, null given, called in /Users/gary/.composer/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php on line 558 and defined in phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/Installer/InstallationManager.php:614
Stack trace:
#0 /Users/gary/.composer/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php(558): Composer\Installer\InstallationManager->getInstallPath(NULL)
#1 /Users/gary/.composer/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php(358): PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin->getPHPCodeSnifferInstallPath()
#2 /Users/gary/.composer/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php(238): PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin->getPhpcsCommand()
#3 /Users/gary/.composer/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php(193): PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin->loadInstalledPaths()
#4 [internal function]: PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin->onDependenciesChangedEvent(Object(Composer\Script\Event))
#5 phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php(192): call_user_func(Array, Object(Composer\Script\Event))
#6 phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php(119): Composer\EventDispatcher\EventDispatcher->doDispatch(Object(Composer\Script\Event))
#7 phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/Installer.php(372): Composer\EventDispatcher\EventDispatcher->dispatchScript('post-update-cmd', false)
#8 phar:///usr/local/bin/wp/vendor/wp-cli/package-command/src/Package_Command.php(398): Composer\Installer->run()
#9 [internal function]: Package_Command->install(Array, Array)
#10 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Dispatcher/CommandFactory.php(100): call_user_func(Array, Array, Array)
#11 [internal function]: WP_CLI\Dispatcher\CommandFactory::WP_CLI\Dispatcher\{closure}(Array, Array)
#12 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Dispatcher/Subcommand.php(497): call_user_func(Object(Closure), Array, Array)
#13 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(470): WP_CLI\Dispatcher\Subcommand->invoke(Array, Array, Array)
#14 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(493): WP_CLI\Runner->run_command(Array, Array)
#15 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(136): WP_CLI\Runner->run_command_and_exit()
#16 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(1228): WP_CLI\Runner->do_early_invoke('before_wp_load')
#17 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Bootstrap/LaunchRunner.php(28): WP_CLI\Runner->start()
#18 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/bootstrap.php(84): WP_CLI\Bootstrap\LaunchRunner->process(Object(WP_CLI\Bootstrap\BootstrapState))
#19 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/wp-cli.php(35): WP_CLI\bootstrap()
#20 phar:///usr/local/bin/wp/php/boot-phar.php(20): include('phar:///usr/loc...')
#21 /usr/local/bin/wp(4): include('phar:///usr/loc...')
#22 {main}
  thrown in phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/Installer/InstallationManager.php on line 614
Reverted composer.json.

The first fatal error points to this line.

Steps to reproduce

Here's my global composer (`~/.composer/composer.json`):
{
    "name": "gamajo/global",
    "description": "Local globally installed Composer packages.",
    "license": "MIT",
    "require": {
        "automattic/vipwpcs": "^3",
        "clue/graph-composer": "^1.1",
        "ergebnis/composer-normalize": "^2.43",
        "icanhazstring/composer-unused": "^0.8",
        "phpcompatibility/php-compatibility": "dev-develop as 9.99.99",
        "phpcompatibility/phpcompatibility-wp": "^2.1",
        "phpcsstandards/phpcsdevtools": "^1.0",
        "phpunit/phpunit": "^9.6",
        "psy/psysh": "@stable"
    },
    "require-dev": {
        "shipmonk/composer-dependency-analyser": "^1.5",
        "tomasvotruba/lines": "^0.5.0"
    },
    "minimum-stability": "dev",
    "prefer-stable": false,
    "config": {
        "allow-plugins": {
            "dealerdirect/phpcodesniffer-composer-installer": true,
            "ergebnis/composer-normalize": true,
            "icanhazstring/composer-unused": true
        }
    }
}
  • Add the above composer.json to ~/.composer/composer.json`
  • Run composer g install / composer g update
  • Run wp package install wp-cli/doctor-command:@stable

Environment

Question Answer
OS Windows/Linux/Mac (preferably with some version info)
PHP version 8.3.22 (same for older versions)
Composer version 2.8.7
PHP_CodeSniffer version 3.13.2
Composer PHPCS plugin version 1.1.1
Install type Composer global
WP-CLI 2.12.0 (same for 2.11.0 - no other WP-CLI packages installed)

Output of ~/.composer/vendor/bin/phpcs --config-show:


Using config file: /Users/gary/.composer/vendor/squizlabs/php_codesniffer/CodeSniffer.conf

installed_paths: /Users/gary/.composer/vendor/automattic/vipwpcs,/Users/gary/.composer/vendor/phpcompatibility/php-compatibility,/Users/gary/.composer/vendor/phpcompatibility/phpcompatibility-paragonie,/Users/gary/.composer/vendor/phpcompatibility/phpcompatibility-wp,/Users/gary/.composer/vendor/phpcsstandards/phpcsdevtools,/Users/gary/.composer/vendor/phpcsstandards/phpcsextra,/Users/gary/.composer/vendor/phpcsstandards/phpcsutils,/Users/gary/.composer/vendor/sirbrillig/phpcs-variable-analysis,/Users/gary/.composer/vendor/wp-coding-standards/wpcs

Tested against main branch?

  • I have verified the issue still exists in the main branch.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions