I am getting the following error in a Drupal 8 site.
The following module is missing from the file system
It looks as if a custom module was installed and deleted without uninstalling it.
How can I fix this error?
I am getting the following error in a Drupal 8 site.
The following module is missing from the file system
It looks as if a custom module was installed and deleted without uninstalling it.
How can I fix this error?
Drush 9
drush cdel core.extension module.MYMODULE Assuming you have deleted an unimportant custom module which doesn't need any uninstall routine to be triggered, you can use the following Drush command.
Drupal 7
drush sql-query "DELETE from system where type = 'module' AND name = 'MYMODULE';" Drupal 8
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='MYMODULE';" See How to fix "The following module is missing from the file system..." warning messages for more info and alternatives.
If you have Drupal Console then a quick way to fix this is to generate a module with the same machine name, then uninstall it.
$ drupal generate:module Then type the machine name at the appropriate prompt and accepts defaults for everything else.
$ drush pm-uninstall Then you can delete the newly generated module from the file system and continue with your day.
(NB you may find need to keep that generated module, else the error will return. In that case, if you need to install a contrib module with the same name, remove the generated module after adding the contrib module. Then clear the cache.)
The way I fixed it was by using drush and composer. Get the module with require, install and uninstall with drush then remove with composer.
composer require drupal/missing_module drush en missing_module drush pmu missing_module composer remove drupal/missing_module ! The step with drush en probably is not nessesary
Now with the Configuration Management module the modules configuration is stored in the core.extension.yml file.
Go to edit the file and try to find the missing module from the filesystem then delete the line and import the config (drush cim).
If this not works but you has found the module, then create the module again (just the folder and a valid .info.yml file) and run again the drush cim command. This will uninstall the module.
One of the biggest headaches involved with this is getting code to production. Certainly, when deploying to prod, you'll either need to do a layered approach to the deployment (one tag for uninstalling the module and one for removing it from the codebase), however when running ci builds, that's not always easy. I have a script that I just finished that helps cover most of your bases if you need ci to complete successfully when developing with a branch that has a module removed but uses the upstream prod database sync for ci testing.
First, it diffs between active core.extension and the file you have in the repo, then it tries installing via composer (only works for drupal config modules that use proper naming conventions), then it runs the sql-query command (which doesn't always work) and the php:eval command (which works far more often than cdel in these situations).
Since these database changes aren't going to production and are only being used for various unit tests, we have found this is sufficient for most of the work we do. If there are still issues, then we fall back to doing two releases, one for uninstalling the configuration and one for uninstalling from the codebase.
build_message "Detecting deleted modules or themes..." deleted_modules=$(${command_prefix}drush cget core.extension --format=yaml | diff -uw - config/$BUILD_CONFIGURATION_FOLDER/core.extension.yml | grep -v '^@@' | grep '^-\s') module_names=($(echo "$deleted_modules" | awk -F': 0' '{print $1}' | sed 's/^- *//' | grep -v '^[[:space:]]*$')) if [ ${#module_names[@]} -gt 0 ]; then build_message "The script has detected modules deleted in $BUILD_CONFIGURATION_FOLDER which still exist in active configuration: $(IFS=', '; echo "${module_names[*]}") These need to be installed then uninstalled in order for config import to run successfully." BUILD_ERRORS+=" - Deleted modules detected.\n" for module in "${module_names[@]}"; do build_message "Attempting to install and uninstall missing module, $module. This may fail if it is not a Drupal contributed module and will likely fail if it is a theme." composer require drupal/$module --ansi # handle error if it can't install exit_code=$? if [ $exit_code -ne 0 ]; then build_message "Could not install/uninstall missing module $module." warning BUILD_ERRORS+=" - $module could not be installed and uninstalled.\n" build_message "Attempting to uninstall via sql-query instead..." ${command_prefix}drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='$module';" ${command_prefix}drush php:eval "\Drupal::configFactory()->getEditable(\"core.extension\")->clear(\"module.$module\")->save(TRUE);" continue fi ${command_prefix}drush cr ${command_prefix}drush pmu $module composer remove drupal/$module --ansi done git checkout composer.* composer install ${command_prefix}drush cr else build_message "No deleted modules or themes detected!" fi if you know exactely what you're doing and can't use a cleaner method from https://www.drupal.org/docs/updating-drupal/troubleshooting-database-updates
here is a suggestion :
drush php:eval '\Drupal::configFactory()->getEditable("core.extension")->clear("module.MY_MODULE_THAT_BREAKS_THINGS")->save(TRUE);' drush cr