Drupal 9 was launched this week. So if your modules are ready it's time to update.

Updating betweeen major versions can be tricky, sometimes Composer won't update a package because another package have a common dependency, but with another version. And sometimes the conflicting package is the one you try to update.

That happened to me when I tried to update drupal/core from 8.8.6 to 9.0.0.

Drupal 9 required a version of a package that was not compatible with Drupal 8, and that stopped Composer from updating.

Are you ready?

I recommend using the Upgrade Status module to check if your site is ready for Drupal 9. It can scan both custom modules and contributed moduls for problems.

Be aware that unsupported modules won't stop composer from updating, so you could crash your site by updating if some of your code is not compatible.

My solution

Here are the steps I did to update. My project was made from Drupal Project and contained drupal/core, drupal/core-dev and drupal/core-composer-scaffold, all with ^8.8.6 as the version.

First I updated composer.json without actually running the updates:

composer require drupal/core-recommended:^9.0.0 drupal/core-composer-scaffold:^9.0.0 drupal/core:^9.0.0  --update-with-dependencies --no-update
composer require drupal/core-dev:^9.0.0 --dev --update-with-dependencies --no-update

Since it's a new major version, composer require is needed instead of update. The option --update-with-dependecies makes composer update dependecies of the specified packages. --no-update prevents Composer from actually updating the packages.

Then it should be safe to run

composer update

After this you should remove drupal/core since drupal/core-recommended is installed.

composer remove drupal/core

And that's it, run database updates and enjoy Drupal 9.