Drupal核心版本必须与core-composer-scaffold、core-recommended及PHP版本严格兼容;推荐用composer create-project drupal/recommended-project:^9.5.14创建项目,升级时执行composer update drupal/core-recommended --with-all-dependencies并清空PHP字节码缓存。

composer install 指定 Drupal 核心版本时,drupal/core 版本号必须和 drupal/core-composer-scaffold 兼容
直接在 composer.json 里写 "drupal/core": "9.5.14" 很容易失败——不是报 Root composer.json requires drupal/core ^9.5.14 -> found drupal/core[...] 找不到包,就是装完后台报 Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException。根本原因是 Drupal 9.5+ 的核心依赖关系变紧了,drupal/core-composer-scaffold、drupal/core-recommended 和 PHP 版本三者必须咬合。
实操建议:
- 优先用
drupal/recommended-project创建项目,它自动锁死兼容组合,比如运行composer create-project drupal/recommended-project:9.5.14 mysite - 如果已有项目要降级/升级核心,先查官方支持矩阵:Drupal 核心与 PHP 版本对应表,再确认
drupal/core-composer-scaffold是否有对应 tag(例如9.5.14版核心需搭配scaffold 9.5.14) - 不要手动改
drupal/core的 version 然后composer update drupal/core——这会跳过 scaffold 和其他推荐包的联动更新,大概率崩掉自动加载
用 composer create-project 安装指定内核版本,必须带完整约束符
composer create-project drupal/recommended-project:9.5.14 看似能装,但实际会失败,因为 9.5.14 不是 Composer 的合法版本约束语法;它会被当成分支名或别名处理,而该仓库没有叫 9.5.14 的分支。
实操建议:
- 写成
composer create-project drupal/recommended-project:^9.5.14(注意^)——Composer 才会按语义化版本规则匹配到确切 tag - 更稳妥的做法是加
--no-interaction和--no-install先拉代码,再进目录执行composer install,避免网络波动中断导致部分依赖残留 - 如果目标版本太老(如
8.9.20),要换镜像源:某些国内镜像不全量同步旧 tag,可临时切回官方源composer config -g repo.packagist composer https://packagist.org
composer update 升级核心时,drupal/core-recommended 是关键中介包
很多人以为改完 drupal/core 版本号再 composer update 就行,结果模块列表全灰、drush cr 报 Class 'Drupal\Core\Render\RendererInterface' not found。问题出在 drupal/core-recommended 这个“元包”没同步更新——它才是真正声明 drupal/core、drupal/core-composer-scaffold、drupal/core-dev 之间兼容关系的包。
实操建议:
- 升级时应运行
composer update drupal/core-recommended --with-all-dependencies,而不是只更新drupal/core - 检查
composer.lock中drupal/core-recommended的 version 字段是否和目标核心一致(如"version": "9.5.14"),不一致说明没真正升级成功 - 升级后务必清空
web/sites/default/files/php目录,否则旧字节码可能干扰新核心的类自动加载
PHP 版本不匹配会导致 composer install 静默跳过核心包
在 PHP 8.2 下执行 composer install 安装标称支持 PHP 8.0+ 的 Drupal 9.5.14,结果 vendor/drupal/core 根本没生成,且无任何错误提示。这是因为 drupal/core 的 composer.json 里写了 "php": "^7.4 || ^8.0",而 Composer 在高版本 PHP 下默认启用 strict platform check,一旦发现平台配置和当前环境不符,就跳过安装——但不会报错,只在 verbose 模式下显示 Skipped installation of drupal/core (no matching package)。
实操建议:
- 执行前先确认当前 PHP 版本:
php -v,再对照目标核心的composer.json中require.php字段 - 临时绕过检查用
composer install --ignore-platform-req=php,但仅限调试,生产环境必须匹配 - 长期方案是用
phpbrew或asdf管理多 PHP 版本,为每个 Drupal 项目绑定对应 PHP runtime
最常被忽略的一点:Drupal 核心版本不是独立变量,它和 scaffold、recommended、PHP、甚至 Drush 的主版本都存在隐式耦合。手动硬改一个字段,往往触发一连串 autoload 失败或服务定义缺失,问题表面在 composer install,根子在约束链断了。










