diff --git a/core/includes/install.inc b/core/includes/install.inc index a590d8dacd0856017f1717f6e519e373802c31b1..06d9500a99b4cd3701b62412981c306eb8a077e4 100644 --- a/core/includes/install.inc +++ b/core/includes/install.inc @@ -1126,7 +1126,9 @@ function install_profile_info($profile, $langcode = 'en') { 'config_install_path' => NULL, ]; $profile_path = \Drupal::service('extension.list.profile')->getPath($profile); - $info = \Drupal::service('info_parser')->parse("$profile_path/$profile.info.yml"); + /** @var \Drupal\Core\Extension\InfoParserInterface $parser */ + $parser = \Drupal::service('info_parser'); + $info = $parser->parse("$profile_path/$profile.info.yml"); $info += $defaults; $dependency_name_function = function ($dependency) { @@ -1138,9 +1140,16 @@ function install_profile_info($profile, $langcode = 'en') { // Convert install key in [project:module] format. $info['install'] = array_map($dependency_name_function, $info['install']); - // drupal_required_modules() includes the current profile as a dependency. - // Remove that dependency, since a module cannot depend on itself. - $required = array_diff(drupal_required_modules(), [$profile]); + // Get a list of core's required modules. + $required = []; + $listing = new ExtensionDiscovery(\Drupal::root()); + $files = $listing->scan('module'); + foreach ($files as $name => $file) { + $parsed = $parser->parse($file->getPathname()); + if (!empty($parsed) && !empty($parsed['required']) && $parsed['required']) { + $required[] = $name; + } + } $locale = !empty($langcode) && $langcode != 'en' ? ['locale'] : []; diff --git a/core/includes/module.inc b/core/includes/module.inc index 373d260a4b8a6a98af5c2a4a7ed1a839830899d3..a2012f3f4c2cde9a9f51fe4744f2e5fc49c40e6a 100644 --- a/core/includes/module.inc +++ b/core/includes/module.inc @@ -61,8 +61,14 @@ function module_load_include($type, $module, $name = NULL) { /** * Returns an array of modules required by core. + * + * @deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. There's no + * replacement. + * + * @see https://www.drupal.org/node/3262811 */ function drupal_required_modules() { + @trigger_error(__FUNCTION__ . "() is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. There's no replacement. See https://www.drupal.org/node/3262811", E_USER_DEPRECATED); $listing = new ExtensionDiscovery(\Drupal::root()); $files = $listing->scan('module'); $required = []; diff --git a/core/tests/Drupal/KernelTests/Core/Extension/ModuleLegacyTest.php b/core/tests/Drupal/KernelTests/Core/Extension/ModuleLegacyTest.php index 1b281c286a7297fc74e32e0fe036837021122a96..a3c86aabd5eae9fee4cd51d10d0acd604a7a9f2e 100644 --- a/core/tests/Drupal/KernelTests/Core/Extension/ModuleLegacyTest.php +++ b/core/tests/Drupal/KernelTests/Core/Extension/ModuleLegacyTest.php @@ -2,6 +2,7 @@ namespace Drupal\KernelTests\Core\Extension; +use Drupal\Core\Extension\ExtensionDiscovery; use Drupal\KernelTests\KernelTestBase; /** @@ -22,4 +23,24 @@ public function testModuleLoadInclude() { } + /** + * Test deprecation of drupal_required_modules() function. + */ + public function testDrupalRequiredModules() { + $this->expectDeprecation("drupal_required_modules() is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. There's no replacement. See https://www.drupal.org/node/3262811"); + /** @var \Drupal\Core\Extension\InfoParserInterface $parser */ + $parser = \Drupal::service('info_parser'); + $listing = new ExtensionDiscovery(\Drupal::root()); + $files = $listing->scan('module'); + // Empty as there's no install profile. + $required = []; + foreach ($files as $name => $file) { + $info = $parser->parse($file->getPathname()); + if (!empty($info) && !empty($info['required']) && $info['required']) { + $required[] = $name; + } + } + $this->assertSame($required, drupal_required_modules()); + } + }