diff --git a/core/modules/system/system.module b/core/modules/system/system.module index c982711..1e46dbd 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -5,6 +5,7 @@ * Configuration system that lets administrators modify the workings of the site. */ +use Composer\Semver\Semver; use Drupal\Component\Utility\UrlHelper; use Drupal\Core\Asset\AttachedAssetsInterface; use Drupal\Core\Cache\Cache; @@ -508,25 +509,34 @@ function system_requirements_alter(array &$requirements = [], $module) { // aren't installed either. if (file_exists($module_dir . '/composer.json')) { - $composer = json_decode(file_get_contents($module_dir . '/composer.json')); - $composer_dependencies = $composer->require; + $semver = new Semver(); - $composer_lock = json_decode(file_get_contents(DRUPAL_ROOT . '/core/composer.lock')); - $installed_packages = $composer_lock->packages; + $module_composer_json = json_decode( file_get_contents($module_dir . 'composer.json')); + $module_package_requirements = $module_composer_json->require; - // Loop over all required packages and check if the package is already - // installed. - $dependencies_installed = []; - foreach ($composer_dependencies as $package_name => $version_requirement) { - foreach ($installed_packages as $installed_package) { - if ($package_name == $installed_package->name) { - $dependencies_installed[] = true; + // The json in composer/installed.json includes all the installed packages + // and is more reliable than checking composer.lock, vendors actually have to be installed to + if (file_exists('vendor/composer/installed.json')) { + $installed_packages = json_decode(file_get_contents('core/vendor/composer/installed.json')); + } else { + $installed_packages = []; + } + + $check_installed_packages = []; + $required_packages = []; + + foreach ($module_package_requirements as $name => $version) { + foreach ($installed_packages as $package) { + if ($package->name === $name) { + if ($semver->satisfies($package->version_normalized, $version)) { + $check_installed_packages[] = $name; + } } } + $required_packages[] = $name; } - // Not all required packages are installed so don't install the module. - if (count($dependencies_installed) < count($composer_dependencies)) { + if ($required_packages !== $check_installed_packages) { $requirements['composer_dependencies'] = [ 'description' => t('Not all the modules have their Composer dependencies installed yet. Please find more information on this handbook page.', [