Install
To start a new Drupal project with version 9.0.0-beta1@beta:To update your site and all dependencies to the latest version of Drupal:
To update your site to this specific release:
Using Composer to manage Drupal site dependencies
Downloads
Release notes
This is a beta release for the next major version of Drupal. Drupal 9 beta releases are intended for site owners and module or theme authors to test compatibility and upgrade paths for Drupal 9.0. Beta releases are not intended for production.
Refer to How to prepare your Drupal 7 or 8 site for Drupal 9 for tools you can use to check the Drupal 9 compatibility of modules, themes, and sites. For more information on 9.0.x development, see #3007300: [META] Release Drupal 9 on June 3 2020.
The 9.0.x branch also includes all the latest commits that will be backported to 8.9.x and earlier branches. 9.0.x and 8.9.x have the same APIs and features. The key changes in 9.0.x are:
- Deprecated code will be removed.
- Dependencies will be updated to new major versions as appropriate.
- Platform requirements (supported PHP and database versions) will be increased.
For all other changes, refer to the 8.9.x branch.
Important changes since 9.0.0-alpha2
For a full list of important changes in Drupal 9.0, be sure to also read the 9.0.0-alpha1 release notes and 9.0.0-alpha2 release notes.
Server and database requirements
Drupal 9 requires PHP 7.3 or higher, and the version requirement for Apache has been increased to Apache 2.4.7 or higher. The following database versions are supported by Drupal 9 core:
- MySQL or Percona 5.7.8.
- MariaDB 10.3.7 (Note that this is a more recent release than the MySQL version.)
- PostgreSQL 10 with the pg_trgm extension.
- SQLite 3.26 (PHP 7.4 does not use the system-provided SQLite, so verify that your PHP is compiled with at least this version). Note that we are discussing lowering this back to 3.22; see the known issues section below.
A contributed database driver is available to provide support for older supported versions of MySQL, Percona, and MariaDB until their end of life. (A similar driver could be created for PostgreSQL 9.)
All identifiers (table names, database names, field names and aliases) are quoted in database queries. Column names or aliases should be wrapped in square brackets when using Connection::query(), db_query(), ConditionInterface::where() or SelectInterface::addExpression. Custom or contrib database drivers should read All identifiers should be quoted in database queries to see what changes are necessary.
Theme system improvements
-
A new Stable 9 base theme has been added for backwards-compatible markup and assets. Its templates and CSS files have been updated to match with the most recent versions in modules. Drupal 8's Stable theme will still be shipped in Drupal 9 along with Stable 9, but will be deprecated during the Drupal 9 lifecycle to be removed in Drupal 10.
-
Classy is no longer a base theme of core themes. Work is underway to further decouple core themes from the Drupal 8 Stable theme. Once this work is complete, the core internal themes will directly receive bugfixes from module changes in minor releases (rather than developers having to copy the fixes into every theme).
Dependency updates
-
The normalize.css dependency has been updated from 3.0.3 to 8.0.1. Themes that are not extending Stable or Classy should manually test in case they need to update. Drupal 8's Stable theme will continue using normalize.css 3.0.3 for backwards compatibility. Read the change record on the normalize.css upgrade for more information.
-
Drupal is now using stable releases for behat/mink (1.8.0) and behat/mink-selenium2-driver (1.4.0).
-
Additional Composer dependency versions have been updated since 9.0.0-alpha2. (Note that Drupal core is incompatible with symfony/dom-crawler version 4.4.5, and this is reflected in the dependency's compatibility constraint.)
-
jQuery Cookie replaced by js-cookie
The jquery.cookie has been replaced with js-cookie version 2. The
core/js-cookielibrary is introduced, and a backwards-compatible shim is provided ascore/jquery.cookiefor Drupal 9.This also required removing jQuery Joyride's dependency on jQuery Cookie. If your site or module initializes Joyride manually, read the change record about the change to Joyride.
We may upgrade to js-cookie 3 if it is available before 9.0.0-rc1.
-
jQuery UI
The jQuery UI asset libraries not in use by Drupal core have been marked deprecated and have been removed from core in Drupal 9.
For a simple upgrade path to Drupal 9, see the change record for information on how to use the provided contributed projects that provide replacements for any modules or themes that depend on these deprecated asset libraries.
Since jQuery UI itself is no longer actively supported, it is recommended to find an alternative for the longer term.
Migration system improvements
A new 'complete node migration' is now available and will migrate all nodes and node revisions, including translated nodes and the translated node revisions. The complete node migration is named d*_node_complete.yml (where * is the major version, 6 or 7) will eventually replace the existing trio of node migrations, d*_node, d*_node_revision, and d*_node_translation. See the change record on the complete node migration for more information.
Upgrading from Drupal 8
Drupal 8 sites can update to Drupal 9 using update.php or drush. Updates will only run on sites that have already been updated to 8.8.0 or later, and we recommend updating from the latest patch release of Drupal 8.8 (or Drupal 8.9.x once that is out), as well as updating all contributed modules, before updating to Drupal 9. Although Drupal 9 is not yet ready for production, we encourage testing of the upgrade path with the beta release.
Even if you are not ready to begin upgrading to Drupal 9, if you are on 8.7.x or older Drupal versions, you should aim to get onto Drupal 8.8.x as soon as possible.
Note for users of the Experimental Workspaces module
Existing Drupal 8 sites using the experimental Workspaces module must update to at least Drupal 8.8.2 before updating to Drupal 9. (This is due to a required data integrity fix.) Remember that Workspaces is currently in beta status and is not intended for production.
Upgrading from Drupal 7
Drupal 7 users can continue to migrate to Drupal 8.8 and the forthcoming Drupal 8.9 release, updating to Drupal 9.0.x can then happen following its release.
The upgrade path for multilingual sites is stable in Drupal 9.0.0-beta1! It will also included in forthcoming releases of Drupal 8.9.x and Drupal 8.8.x.
Known issues
- #3113992: The 'Update' page has no idea that some updates are incompatible
- #3107155: Raise SQLite version requirement to 3.26 in Drupal 9
All changes since 9.0.0-alpha2
- #3120954 by tim.plunkett, czigor: Add function name to the deprecation message about theme functions
- #3118087 by dww, JoshaHubbers, jungle, tedbow, RajabNatshah, Kingdutch, JonMcL, xjm, Nick Hope, wroehrig, wxman, broeker, mlozano7, kazajhodo, suit4, xmacinfo, BrightBold: If any extension has a missing or invalid version, Update manager throws errors and is confused about site update status
- #3119373 by alexpott, BramDriesen: Configuration synchronisation that both enables & configures a module fails and drupal_flush_all_caches()
- #2550717 follow-up by droplet, bnjmnm, tedbow, lauriii: [JS] Replace jQuery.cookie with JS-cookie and provide a BC layer
- Revert "Issue #2550717 follow-up by bnjmnm, tedbow, lauriii: [JS] Replace jQuery.cookie with JS-cookie and provide a BC layer"
- #2550717 follow-up by bnjmnm, tedbow, lauriii: [JS] Replace jQuery.cookie with JS-cookie and provide a BC layer
- #474684 by bnjmnm, dawehner, tedbow, pfrenssen, JohnAlbin, ademarco, kalpaitch, vdacosta@voidtek.com, rensingh99, markcarver, jungle, jhedstrom, RobLoach, almaudoh, kevineinarsson, shaal, dpagini, thedavidmeister, sreynen, Snugug, Miguel.kode, kamkejj, alexpott, Pol, sun, Wim Leers, lauriii, tim.plunkett, eaton: Allow themes to declare dependencies on modules
- #3117342 by longwave, alexpott: Update dependencies for Drupal 9
- SA-CORE-2020-001 by lauriii, Wim Leers, catch
- #3120124 by effulgentsia, daffie: Raise the minimum MariaDB version to 10.3(.7) in Drupal 9
- #3103529 by alexpott, mcdruid, Chris Burge, greg.1.anderson, rfay, anavarre, catch, Gábor Hojtsy: Drupal 8.8.1+ and 9 can fail to install in the web browser due to cache pollution
- #3118832 by effulgentsia, alexpott, daffie: Allow custom database drivers to extend and have the same name as the core ones
- #3119910 by mondrake: Change hardcoded quote identifier in EntityQueryTest to square brackets
- #3119847 by jungle, dww: Fix typos in InfoParserUnitTest and UpdaterTest doc comments
- #3105925 by kiamlaluno: The description of the arguments for FieldDefinition::setDisplayOptions() conflicts with what reported in FieldDefinitionInterface::getDisplayOptions()
- #3119445 by kiamlaluno, Deepthi kumari: The documentation comment for BanIpManager::__construct() says it constructs the BanSubscriber
- #3115005 by bnjmnm: Remove fieldset CSS that was only there to work around a now-fixed Firefox bug
- #3118581 by kiamlaluno: The documentation for Crypt::randomBytesBase64() is wrong about the output length
- Issue #3105701 by tedbow, xjm, Gábor Hojtsy, Krzysztof Doma≈Ñski, dww, Wim Leers, jungle: Do not allow core: 9.x in info.yml files
- #2999549 by mtift, Daniel Korte, mherchel, alexpott, larowlan: Allow button tag in LinkGenerator for better accessibility
- #2550717 by mradcliffe, bnjmnm, finnsky, Manuel Garcia, lauriii, longwave, tedbow, silesky, catch, xjm, droplet, johndevman, nod_, marassa: [JS] Replace jQuery.cookie with JS-cookie and provide a BC layer
- #2966856 by Gábor Hojtsy, quietone, alexpott, vuil, catch, heddn: Hide and disable Drupal Migrate Multilingual
- Revert "Issue #3103529 by mcdruid, alexpott, Chris Burge, greg.1.anderson, rfay, anavarre, Gábor Hojtsy: Drupal 8.8.1+ and 9 can fail to install in the web browser due to cache pollution"
- #3078671 by alexpott, Simon Peacock, greg.1.anderson, vuil, jungle, rodrigoaguilera, sam-elayyoub, mmjvb, karolrybak, catch: Pin behat/mink and behat/mink-selenium2-driver to use resolvable release
- #2986452 by alexpott, andypost, kostyashupenko, daffie, kriboogh, larowlan, kristiaanvandeneynde, chrisrockwell, bleen, nevergone: Database reserved keywords need to be quoted as per the ANSI standard. Also resolves https://www.drupal.org/project/drupal/issues/371
- #3103529 by mcdruid, alexpott, Chris Burge, greg.1.anderson, rfay, anavarre, Gábor Hojtsy: Drupal 8.8.1+ and 9 can fail to install in the web browser due to cache pollution
- #3114909 by hchonov, ravi.shankar, alexpott: Inconsistency between EntityTypeInterface ::getHandlerClass() and ::hasHandlerClass()
- Revert "Issue #3113403 by Beakerboy, daffie: Make Drupal\Core\Database\Query\Condition driver overridable"
- #3113403 by Beakerboy, daffie: Make Drupal\Core\Database\Query\Condition driver overridable
- #3114041 by swatichouhan012, longwave, chr.fritsch, alexpott, mondrake: PhpUnit 8 tests breaking because of compatibility issue with setUp()
- #3113211 by bnjmnm, lauriii, xjm: Create test for theme asset decoupling from Stable and address any regressions that decoupling may cause
- #2746541 by quietone, alexpott, maxocub, Wim Leers, mikelutz, jofitz, masipila, firewaller, Madhura BK, Gábor Hojtsy, catch, heddn, plach, hchonov: Migrate D6 and D7 node revision translations to D8
- #2865416 by owenpm3, swatichouhan012, neelam_wadhwani, cilefen: Root README.txt installation profile section links to D7 docs
- #3050374 by bnjmnm, lauriii, alexpott, DyanneNova, xjm: Create Drupal 9 stable theme
- #3119017 by Gábor Hojtsy, effulgentsia, catch, daffie: Tests fail with MariaDB 10.2.7, but not 10.3.22
- #3118477 by mondrake, Mile23: RegistryTest, RegistryLegacyTest both define the same class, use mock instead
- #3078671 by Simon Peacock, greg.1.anderson, vuil, alexpott, jungle, rodrigoaguilera, sam-elayyoub, mmjvb, karolrybak: Pin behat/mink and behat/mink-selenium2-driver to use resolvable release
- #3106666 by catch, jungle, xjm, alexpott, tim.plunkett, Berdir: Remove post updates added prior to 8.8.0
- #3043471 by longwave, catch, Wim Leers, xjm: Replace the DiactorosFactory message factory in symfony/psr-http-message-bridge with a PSR-17 compliant message factory
- #3118998 by katherined, neelam_wadhwani, phenaproxima, effulgentsia: Remove null default for $memory_cache in entity storage handler constructors
- #3117558 by alexpott, xjm, longwave: 9.0.x core's hash in composer.lock is wrong
- #3118439 by kiamlaluno: PrivateKey::__construct() describes itself as "Constructs the token generator."
- #3010378 by benjifisher, piotrkonefal: BookManager::buildItems() is slow because it loads nodes
- #2821525 by bnjmnm, chrisrockwell, tedbow, alexpott, droplet, lauriii, DyanneNova, effulgentsia, xjm, joelpittet, Cottser, andrewmacpherson: Update normalize.css to the most recent version
- #3119027 by Berdir, andypost: Use filled dump for RestSettingsDeletionUpdateTest
- #3098475 by Berdir, catch, TravisCarden, xjm, benjifisher, alexpott, larowlan, webchick, dww: Add more strict checking of hook_update_last_removed() and better explanation
- #2917600 by tedbow, alexpott, catch, anthonyf, xjm, andypost, Alan D., moshe weitzman, Berdir: update_fix_compatibility() puts sites into unrecoverable state
- #3066801 by catch, WidgetsBurritos, pobster, jungle, tim.plunkett, xjm, dww, alexpott, webchick, benjifisher, longwave, worldlinemine, lauriii, Berdir: Add hook_removed_post_updates()
- #3118958 by lauriii: Follow-up to #3102724: CSSLint failure
- #3087130 by alexpott, aleevas, rensingh99, andypost, chr.fritsch, DanielVeza: Profile configuration should be able to depend on optional configuration provided by modules
- #2846994 by Gábor Hojtsy, jungle, andypost, daffie, swatichouhan012, xjm, catch, effulgentsia, bzrudi71, mradcliffe, TravisCarden, Mixologic: Increase minimum version requirement for Postgres to 10 and require the pg_trgm extension
- #3114079 by johndevman, catch, Liam Morland, longwave, mr.baileys, alexpott, Charlie ChX Negyesi: [policy, no patch] Update minimum supported Apache version to >= 2.4.7
- #3117217 by bnjmnm, lauriii: Decouple core theme dependency on functions in stable.theme
- #3118454 by catch, andypost, xjm, Gábor Hojtsy, mradcliffe, mondrake: Drupal\KernelTests\Core\Database\SelectTest fails on postgres 10
- #3107155 by catch, effulgentsia, andypost, xjm, daffie, Gábor Hojtsy, alexpott, mondrake: Raise SQLite version requirement to 3.26 in Drupal 9
- #3109534 by TravisCarden, mondrake, effulgentsia, andypost, Gábor Hojtsy, catch, daffie, xjm: Raise the minimum MySQL version to 5.7.8 and MariaDB version to 10.2.7 in Drupal 9
- Revert "Issue #3107155 by effulgentsia, catch, daffie, Gábor Hojtsy, andypost, xjm: Raise SQLite version requirement to 3.26 in Drupal 9"
- #3118079 by lauriii, bnjmnm: Remove postcss-header workaround
- #3115624 by martijn.cuppens, jungle, JeroenT, greg.1.anderson, Mile23: Scaffolding: Only add root files to gitignore
- Revert "Issue #3109534 by TravisCarden, mondrake, andypost, Gábor Hojtsy, daffie, effulgentsia, xjm: Raise the minimum MySQL version to 5.7 and MariaDB version to 10.2 in Drupal 9"
- #3113556 by tedbow, DamienMcKenna, bnjmnm, lauriii: Change Views UI to use drupal.dialog instead of jquery.ui.dialog
- #3117250 by alexpott, longwave: Update StringLoader and TestLoader for Twig 3 compatibility
- #3116856 by alexpott, Mile23: Workaround PHPUnit 8 warnings
- #3074585 by mikelutz, alexpott, Berdir, Mile23, heddn, effulgentsia, Wim Leers: [Symfony 5] Replace app.root and site.path string services with container parameters
- #3117188 by dww, Gábor Hojtsy: Change @todo comment in core/modules/update/src/ProjectSecurityData.php to point to a better issue
- #3003401 by Sam152: UpdatePathTestBase calls setDatabaseDumpFiles twice, resulting in duplicate fixtures in some scenarios
- #3055197 by mikelutz: [Symfony 5] The "Goutte\Client" class extends "Symfony\Component\BrowserKit\Client" that is deprecated since Symfony 4.3, use "\Symfony\Component\BrowserKit\AbstractBrowser" instead
- #3108416 by catch, amateescu, alexpott, xjm: Remove workspace_update_8803()
- #3107155 by effulgentsia, catch, daffie, Gábor Hojtsy, andypost, xjm: Raise SQLite version requirement to 3.26 in Drupal 9
- #3109534 by TravisCarden, mondrake, andypost, Gábor Hojtsy, daffie, effulgentsia, xjm: Raise the minimum MySQL version to 5.7 and MariaDB version to 10.2 in Drupal 9