Skip to content

PHP 8.5 | Fatal error on installing from artifact in CI #12471

@jrfnl

Description

@jrfnl

My composer.json:

{
    "name": "jrfnl/composer-issue-12471",
    "require-dev": {
        "squizlabs/php_codesniffer": "^3.13",
        "dealerdirect/phpcodesniffer-composer-installer": "*"
    },
    "repositories": [
        {
            "type": "artifact",
            "url": "./artifact/"
        }
    ],
    "config": {
        "allow-plugins": {
            "dealerdirect/phpcodesniffer-composer-installer": true
        },
        "lock": false
    }
}

... with an artifact for the dealerdirect/phpcodesniffer-composer-installer package.

For a minimal reproduction code sample, please check out: https://github.com/jrfnl/bug-report-reproduction-scenarios/tree/php-8.5/composer-with-artifact.

When I run this command on PHP 8.5:

composer install -vvv --no-interaction

I get the following output:

Running 2.8.9 (2025-05-13 14:01:37) with PHP 8.5.0-dev on Linux / 6.11.0-1015-azure
Reading ./composer.json (/home/runner/work/bug-report-reproduction-scenarios/bug-report-reproduction-scenarios/composer.json)
Loading config file ./composer.json (/home/runner/work/bug-report-reproduction-scenarios/bug-report-reproduction-scenarios/composer.json)
Checked CA file /etc/pki/tls/certs/ca-bundle.crt does not exist or it is not a file.
Checked directory /etc/pki/tls/certs/ca-bundle.crt does not exist or it is not a directory.
Checked CA file /etc/ssl/certs/ca-certificates.crt: valid
Executing command (/home/runner/work/bug-report-reproduction-scenarios/bug-report-reproduction-scenarios): 'git' 'branch' '-a' '--no-color' '--no-abbrev' '-v'
Reading /home/runner/.composer/composer.json
Loading config file /home/runner/.composer/composer.json (/home/runner/.composer/composer.json)
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Found package dealerdirect/phpcodesniffer-composer-installer (1.[9](https://github.com/jrfnl/bug-report-reproduction-scenarios/actions/runs/16180170758/job/45674763646#step:4:10)9.99) in file dealerdirect-phpcodesniffer-composer-installer-1.99.99.zip
Downloading https://repo.packagist.org/packages.json
[200] https://repo.packagist.org/packages.json
Writing /home/runner/.cache/composer/repo/https---repo.packagist.org/packages.json into cache
Downloading https://repo.packagist.org/p2/squizlabs/php_codesniffer.json
[200] https://repo.packagist.org/p2/squizlabs/php_codesniffer.json
Writing /home/runner/.cache/composer/repo/https---repo.packagist.org/provider-squizlabs~php_codesniffer.json into cache
Built pool.
Running pool optimizer.
Pool optimizer completed in 0.001 seconds
Found 127 package versions referenced in your dependency graph. 2 (2%) were optimized away.
Updating dependencies
Generating rules
Resolving dependencies through SAT
Looking at all rules.

Dependency resolution completed in 0.000 seconds
Analyzed 125 packages to resolve dependencies
Analyzed 132 rules to resolve dependencies
Generating rules
Resolving dependencies through SAT
Looking at all rules.

Dependency resolution completed in 0.000 seconds
Package operations: 2 installs, 0 updates, 0 removals
Installs: squizlabs/php_codesniffer:3.13.2, dealerdirect/phpcodesniffer-composer-installer:1.99.99
  - Downloading squizlabs/php_codesniffer (3.13.2)
Downloading https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5b5e3821314f947dd040c70f7992a64eac89025c
  - Downloading dealerdirect/phpcodesniffer-composer-installer (1.99.99)
  - Downloading dealerdirect/phpcodesniffer-composer-installer (1.99.99)
  - Downloading dealerdirect/phpcodesniffer-composer-installer (1.99.99)
  - Downloading dealerdirect/phpcodesniffer-composer-installer (1.99.99)
[302] https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5b5e3821314f947dd040c70f7992a64eac89025c
Following redirect (1) https://codeload.github.com/PHPCSStandards/PHP_CodeSniffer/legacy.zip/5b5e3821314f947dd040c70f7992a64eac89025c
[200] https://codeload.github.com/PHPCSStandards/PHP_CodeSniffer/legacy.zip/5b5e3821314f947dd040c70f7992a64eac89025c
Writing /home/runner/.cache/composer/files/squizlabs/php_codesniffer/61499251deb4180996e5439e8980cceeca492e46.zip into cache from /home/runner/work/bug-report-reproduction-scenarios/bug-report-reproduction-scenarios/vendor/composer/tmp-d506b31d6ef5fa2a81204e95087b17a9.zip
Error: stream_context_create(): Argument #1 ($options) must be an array with valid callbacks as values, cannot access protected method Composer\Util\RemoteFilesystem::callbackGet()

In StreamContextFactory.php line 56:
                                                                               
  [TypeError]                                                                  
  stream_context_create(): Argument #1 ($options) must be an array with valid  
   callbacks as values, cannot access protected method Composer\Util\RemoteFi  
  lesystem::callbackGet()                                                      
                                                                               

Exception trace:
  at phar:///usr/local/bin/composer/src/Composer/Util/StreamContextFactory.php:56
 stream_context_create() at phar:///usr/local/bin/composer/src/Composer/Util/StreamContextFactory.php:56
 Composer\Util\StreamContextFactory::getContext() at phar:///usr/local/bin/composer/src/Composer/Util/RemoteFilesystem.php:274
 Composer\Util\RemoteFilesystem->get() at phar:///usr/local/bin/composer/src/Composer/Util/RemoteFilesystem.php:[10](https://github.com/jrfnl/bug-report-reproduction-scenarios/actions/runs/16180170758/job/45674763646#step:4:11)7
 Composer\Util\RemoteFilesystem->copy() at phar:///usr/local/bin/composer/src/Composer/Util/HttpDownloader.php:248
 Composer\Util\HttpDownloader::{closure:Composer\Util\HttpDownloader::addJob():240}() at phar:///usr/local/bin/composer/vendor/react/promise/src/Promise.php:283
 React\Promise\Promise->call() at phar:///usr/local/bin/composer/vendor/react/promise/src/Promise.php:41
 React\Promise\Promise->__construct() at phar:///usr/local/bin/composer/src/Composer/Util/HttpDownloader.php:280
 Composer\Util\HttpDownloader->addJob() at phar:///usr/local/bin/composer/src/Composer/Util/HttpDownloader.php:178
 Composer\Util\HttpDownloader->addCopy() at phar:///usr/local/bin/composer/src/Composer/Downloader/FileDownloader.php:195
 Composer\Downloader\FileDownloader->{closure:Composer\Downloader\FileDownloader::download():158}() at phar:///usr/local/bin/composer/src/Composer/Downloader/FileDownloader.php:280
 Composer\Downloader\FileDownloader->{closure:Composer\Downloader\FileDownloader::download():248}() at phar:///usr/local/bin/composer/vendor/react/promise/src/Internal/RejectedPromise.php:73
 React\Promise\Internal\RejectedPromise->then() at phar:///usr/local/bin/composer/src/Composer/Downloader/FileDownloader.php:196
 Composer\Downloader\FileDownloader->{closure:Composer\Downloader\FileDownloader::download():158}() at phar:///usr/local/bin/composer/src/Composer/Downloader/FileDownloader.php:280
 Composer\Downloader\FileDownloader->{closure:Composer\Downloader\FileDownloader::download():248}() at phar:///usr/local/bin/composer/vendor/react/promise/src/Internal/RejectedPromise.php:73
 React\Promise\Internal\RejectedPromise->then() at phar:///usr/local/bin/composer/src/Composer/Downloader/FileDownloader.php:196
 Composer\Downloader\FileDownloader->{closure:Composer\Downloader\FileDownloader::download():158}() at phar:///usr/local/bin/composer/src/Composer/Downloader/FileDownloader.php:280
 Composer\Downloader\FileDownloader->{closure:Composer\Downloader\FileDownloader::download():248}() at phar:///usr/local/bin/composer/vendor/react/promise/src/Internal/RejectedPromise.php:73
 React\Promise\Internal\RejectedPromise->then() at phar:///usr/local/bin/composer/src/Composer/Downloader/FileDownloader.php:196
 Composer\Downloader\FileDownloader->{closure:Composer\Downloader\FileDownloader::download():158}() at phar:///usr/local/bin/composer/src/Composer/Downloader/FileDownloader.php:301
 Composer\Downloader\FileDownloader->download() at phar:///usr/local/bin/composer/src/Composer/Downloader/ZipDownloader.php:100
 Composer\Downloader\ZipDownloader->download() at phar:///usr/local/bin/composer/src/Composer/Downloader/DownloadManager.php:223
 Composer\Downloader\DownloadManager->{closure:Composer\Downloader\DownloadManager::download():191}() at phar:///usr/local/bin/composer/src/Composer/Downloader/DownloadManager.php:235
 Composer\Downloader\DownloadManager->download() at phar:///usr/local/bin/composer/src/Composer/Installer/LibraryInstaller.php:[11](https://github.com/jrfnl/bug-report-reproduction-scenarios/actions/runs/16180170758/job/45674763646#step:4:12)4
 Composer\Installer\LibraryInstaller->download() at phar:///usr/local/bin/composer/src/Composer/Installer/PluginInstaller.php:74
 Composer\Installer\PluginInstaller->download() at phar:///usr/local/bin/composer/src/Composer/Installer/InstallationManager.php:280
 Composer\Installer\InstallationManager->downloadAndExecuteBatch() at phar:///usr/local/bin/composer/src/Composer/Installer/InstallationManager.php:221
 Composer\Installer\InstallationManager->execute() at phar:///usr/local/bin/composer/src/Composer/Installer.php:839
 Composer\Installer->doInstall() at phar:///usr/local/bin/composer/src/Composer/Installer.php:649
 Composer\Installer->doUpdate() at phar:///usr/local/bin/composer/src/Composer/Installer.php:298
 Composer\Installer->run() at phar:///usr/local/bin/composer/src/Composer/Command/InstallCommand.php:147
 Composer\Command\InstallCommand->execute() at phar:///usr/local/bin/composer/vendor/symfony/console/Command/Command.php:298
 Symfony\Component\Console\Command\Command->run() at phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:1040
 Symfony\Component\Console\Application->doRunCommand() at phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:301
 Symfony\Component\Console\Application->doRun() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:397
 Composer\Console\Application->doRun() at phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:171
 Symfony\Component\Console\Application->run() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:[13](https://github.com/jrfnl/bug-report-reproduction-scenarios/actions/runs/16180170758/job/45674763646#step:4:14)7
 Composer\Console\Application->run() at phar:///usr/local/bin/composer/bin/composer:98
 require() at /usr/local/bin/composer:29

install [--prefer-source] [--prefer-dist] [--prefer-install PREFER-INSTALL] [--dry-run] [--download-only] [--dev] [--no-suggest] [--no-dev] [--no-autoloader] [--no-progress] [--no-install] [--audit] [--audit-format AUDIT-FORMAT] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--apcu-autoloader-prefix APCU-AUTOLOADER-PREFIX] [--ignore-platform-req IGNORE-PLATFORM-REQ] [--ignore-platform-reqs] [--] [<packages>...]

Error: Process completed with exit code 1.

You can see this in the GH Actions workflow output for the above linked branch: https://github.com/jrfnl/bug-report-reproduction-scenarios/actions/runs/16180170758

And I expected this to happen:

The composer install to succeed ;-)

The above works in all stable PHP versions I run tests with (PHP 5.4 - 8.4), but fails on PHP 8.5-dev.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions