ComposerInstallersTrait.php

Namespace

Drupal\Tests\package_manager\Traits

File

core/modules/package_manager/tests/src/Traits/ComposerInstallersTrait.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\package_manager\Traits;

use Composer\InstalledVersions;
use Drupal\fixture_manipulator\FixtureManipulator;
use Drupal\package_manager\ComposerInspector;
use Symfony\Component\Process\Process;

/**
 * A utility for kernel tests that need to use 'composer/installers'.
 *
 * @internal
 */
trait ComposerInstallersTrait {
    
    /**
     * Installs the composer/installers package.
     *
     * @param string $dir
     *   The fixture directory to install into.
     */
    private function installComposerInstallers(string $dir) : void {
        $package_name = 'composer/installers';
        $this->assertTrue(InstalledVersions::isInstalled($package_name));
        $repository = json_encode([
            'type' => 'path',
            'url' => InstalledVersions::getInstallPath($package_name),
            'options' => [
                'symlink' => FALSE,
                'versions' => [
                    // Explicitly state the version contained by this path repository,
                    // otherwise Composer will infer the version based on the git clone or
                    // fall back to `dev-master`.
                    // @see https://getcomposer.org/doc/05-repositories.md#path
'composer/installers' => InstalledVersions::getVersion($package_name),
                ],
            ],
        ], JSON_UNESCAPED_SLASHES);
        $working_dir_option = "--working-dir={$dir}";
        (new Process([
            'composer',
            'config',
            'repo.composer-installers-real',
            $repository,
            $working_dir_option,
        ]))->mustRun();
        (new FixtureManipulator())->addConfig([
            'allow-plugins.composer/installers' => TRUE,
        ])
            ->commitChanges($dir);
        (new Process([
            'composer',
            'require',
            'composer/installers:@dev',
            $working_dir_option,
        ]))->mustRun();
        // Use the default installer paths for Drupal core and extensions.
        $this->setInstallerPaths([], $dir);
    }
    
    /**
     * Sets the installer paths config.
     *
     * @param array $installer_paths
     *   The installed paths.
     * @param string $directory
     *   The fixture directory.
     */
    private function setInstallerPaths(array $installer_paths, string $directory) : void {
        // Respect any existing installer paths.
        $extra = $this->container
            ->get(ComposerInspector::class)
            ->getConfig('extra', $directory . '/composer.json');
        $existing_installer_paths = json_decode($extra, TRUE, flags: JSON_THROW_ON_ERROR)['installer-paths'] ?? [];
        (new FixtureManipulator())->addConfig([
            'extra.installer-paths' => $installer_paths + $existing_installer_paths,
        ])
            ->commitChanges($directory);
    }

}

Traits

Title Deprecated Summary
ComposerInstallersTrait A utility for kernel tests that need to use 'composer/installers'.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.