diff -u b/core/core.services.yml b/core/core.services.yml --- b/core/core.services.yml +++ b/core/core.services.yml @@ -290,7 +290,7 @@ - { name: event_subscriber } config.installer: class: Drupal\Core\Config\ConfigInstaller - arguments: ['@config.factory', '@config.storage', '@config.typed', '@config.manager', '@event_dispatcher', '@profile_handler'] + arguments: ['@config.factory', '@config.storage', '@config.typed', '@config.manager', '@event_dispatcher'] lazy: true config.storage: class: Drupal\Core\Config\CachedStorage @@ -298,7 +298,7 @@ - { name: event_subscriber } config.installer: class: Drupal\Core\Config\ConfigInstaller - arguments: ['@config.factory', '@config.storage', '@config.typed', '@config.manager', '@event_dispatcher'] + arguments: ['@config.factory', '@config.storage', '@config.typed', '@config.manager', '@event_dispatcher', '@profile_handler'] lazy: true config.storage: class: Drupal\Core\Config\CachedStorage @@ -498,9 +498,6 @@ - { name: module_install.uninstall_validator } arguments: ['@string_translation'] lazy: true - profile_handler: - class: Drupal\Core\Extension\ProfileHandler - arguments: ['@app.root', '@info_parser'] theme_handler: class: Drupal\Core\Extension\ThemeHandler arguments: ['@app.root', '@config.factory', '@module_handler', '@state', '@info_parser'] @@ -509,6 +506,9 @@ - { name: module_install.uninstall_validator } arguments: ['@string_translation'] lazy: true + profile_handler: + class: Drupal\Core\Extension\ProfileHandler + arguments: ['@app.root', '@info_parser'] theme_handler: class: Drupal\Core\Extension\ThemeHandler arguments: ['@app.root', '@config.factory', '@module_handler', '@state', '@info_parser'] diff -u b/core/lib/Drupal/Core/Extension/ProfileHandler.php b/core/lib/Drupal/Core/Extension/ProfileHandler.php --- b/core/lib/Drupal/Core/Extension/ProfileHandler.php +++ b/core/lib/Drupal/Core/Extension/ProfileHandler.php @@ -76,24 +76,20 @@ $filename = file_exists($profile_path . "/$profile.$type") ? "$profile.$type" : NULL; $extension = new Extension($this->root, $type, $profile_file, $filename); + $info_defaults = array(); + // Installation profiles are hidden by default, unless explicitly specified // otherwise in the .info.yml file. - if (!isset($profile_info['hidden'])) { - $profile_info['hidden'] = TRUE; - } - - // The installation profile is required, if it's a valid module. - $profile_info['required'] = TRUE; - // Add a default distribution name if the profile did not provide one. - // @see install_profile_info() - // @see drupal_install_profile_distribution_name() - if (!isset($profile_info['distribution']['name'])) { - $profile_info['distribution']['name'] = 'Drupal'; - } + $info_defaults['hidden'] = isset($profile_info['hidden']) ? $profile_info['hidden'] : TRUE; - $extension->info = $profile_info; + $extension->info = $profile_info + $info_defaults; $extension->weight = $weight; + // See @1356276-192. Issue in System::_system_rebuild_module_data, + // The $extension->info gets changed, so we need to save the original + // parse result elsewhere so it can be used to set profile defaults. + $extension->info_defaults = $info_defaults; + // Add requested profile as last one. $profiles[$profile] = $extension; } diff -u b/core/modules/system/system.module b/core/modules/system/system.module --- b/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -990,8 +990,12 @@ // Read info files for each module. foreach ($modules as $key => $module) { // Look for the info file. - if (empty($module->info)) { - $module->info = \Drupal::service('info_parser')->parse($module->getPathname()); + $module->info = \Drupal::service('info_parser')->parse($module->getPathname()); + // Add any defaults stored in the extension (see ProfileHandler) + if (!empty($module->info_defaults)) { + $module->info = $module->info + $module->info_defaults; + } + else { } // Add the info file modification time, so it becomes available for @@ -1014,6 +1018,19 @@ _system_rebuild_module_data_ensure_required($module, $modules); } + // This must be done after _system_rebuild_module_data_ensure_required(). + $profile = drupal_get_profile(); + if ($profile && isset($modules[$profile])) { + // The installation profile is required, if it's a valid module. + $modules[$profile]->info['required'] = TRUE; + // Add a default distribution name if the profile did not provide one. + // @see install_profile_info() + // @see drupal_install_profile_distribution_name() + if (!isset($modules[$profile]->info['distribution']['name'])) { + $modules[$profile]->info['distribution']['name'] = 'Drupal'; + } + } + return $modules; }