diff -u b/core/includes/file.inc b/core/includes/file.inc --- b/core/includes/file.inc +++ b/core/includes/file.inc @@ -947,18 +947,12 @@ $dir_has_slash = (substr($dir, -1) === '/'); } - // By default, when there is no explicit 'nomask' option, do not check for - // files in common special-purpose directories. The folders here are front-end - // related and they have been added to avoid issues with Drupal recursive - // scanning. In this case, we added node_modules and bower_components. This - // also improves performance on frontend builds. - if (!isset($options['nomask'])) { - $ignore_directories = Settings::get('drupal_file_scan_ignore_directories', [ - 'node_modules', - 'bower_components', - ]); - $options['nomask'] = '/^' . implode('|', $ignore_directories) . '$/'; - } + // Allow directories specified in settings.php to be ignored. You can use this + // to not check for files in common special-purpose directories. For example, + // node_modules and bower_components. Ignoring irrelevant directories is a + // performance boost. + $ignore_directories = Settings::get('file_scan_ignore_directories', []); + $default_nomask = '/^' . implode('|', $ignore_directories) . '$/'; $options['key'] = in_array($options['key'], array('uri', 'filename', 'name')) ? $options['key'] : 'uri'; $files = array(); @@ -968,7 +962,10 @@ if ($handle = @opendir($dir)) { while (FALSE !== ($filename = readdir($handle))) { // Skip this file if it matches the nomask or starts with a dot. - if ($filename[0] != '.' && !(isset($options['nomask']) && preg_match($options['nomask'], $filename))) { + if ($filename[0] != '.' + && !(isset($options['nomask']) && preg_match($options['nomask'], $filename)) + && !(!empty($default_nomask) && preg_match($default_nomask, $filename)) + ) { if ($depth == 0 && $dir_has_slash) { $uri = "$dir$filename"; } diff -u b/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php b/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php --- b/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php +++ b/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php @@ -71,9 +71,6 @@ 'js', 'misc', 'templates', - // Deeply nested Node.js subdirectories. - 'node_modules', - 'bower_components', // Legacy subdirectories. 'includes', // Test subdirectories. @@ -90,6 +87,20 @@ protected $acceptTests = FALSE; /** + * Construct a RecursiveExtensionFilterIterator. + * + * @param \RecursiveIterator $iterator + * The iterator to filter. + * @param array $blacklist + * (optional) Add to the blacklist of directories that should be filtered + * out during the iteration. + */ + public function __construct(\RecursiveIterator $iterator, array $blacklist = []) { + parent::__construct($iterator); + $this->blacklist += $blacklist; + } + + /** * Controls whether test directories will be scanned. * * @param bool $flag diff -u b/sites/default/default.settings.php b/sites/default/default.settings.php --- b/sites/default/default.settings.php +++ b/sites/default/default.settings.php @@ -706,15 +706,14 @@ /** * The list of folders disabled for directory scanning. - * As default values we added node_modules and bower_components - * folders to avoid issues with Drupal recursive scanning. * - * Uncomment the below strings to override default state. + * By default ignore node_modules and bower_components folders to avoid issues + * with Drupal recursive scanning. */ -# $settings['drupal_file_scan_ignore_directories'] = [ -# 'node_modules', -# 'bower_components', -# ]; +$settings['file_scan_ignore_directories'] = [ + 'node_modules', + 'bower_components', +]; /** * Load local development override configuration, if available. only in patch2: unchanged: --- a/core/lib/Drupal/Core/Extension/ExtensionDiscovery.php +++ b/core/lib/Drupal/Core/Extension/ExtensionDiscovery.php @@ -433,11 +433,17 @@ protected function scanDirectory($dir, $include_tests) { $flags |= \FilesystemIterator::CURRENT_AS_SELF; $directory_iterator = new \RecursiveDirectoryIterator($absolute_dir, $flags); + // Allow directories specified in settings.php to be ignored. You can use + // this to not check for files in common special-purpose directories. For + // example, node_modules and bower_components. Ignoring irrelevant + // directories is a performance boost. + $ignore_directories = Settings::get('file_scan_ignore_directories', []); + // Filter the recursive scan to discover extensions only. // Important: Without a RecursiveFilterIterator, RecursiveDirectoryIterator // would recurse into the entire filesystem directory tree without any kind // of limitations. - $filter = new RecursiveExtensionFilterIterator($directory_iterator); + $filter = new RecursiveExtensionFilterIterator($directory_iterator, $ignore_directories); $filter->acceptTests($include_tests); // The actual recursive filesystem scan is only invoked by instantiating the