composer update drupal/core 不生效是因为 drupal/core 被 drupal/recommended-project 锁定,需升级后者并加 --with-all-dependencies;升级后须清理缓存、校验 web/core/ 和 autoload,否则类加载异常。

composer update drupal/core 为什么不管用
因为 drupal/core 在 drupal/recommended-project 模板里被锁死在根依赖中,不是直接可更新的包。你执行 composer update drupal/core 实际上不会升级核心——Composer 会跳过它,除非你同时更新它的“父约束”,也就是 drupal/recommended-project 本身。
常见错误现象:composer update drupal/core 输出 “Nothing to install or update”,或者只升了子依赖(比如 drupal/core-composer-scaffold),但 web/core/ 下的 PHP 文件版本没变。
- 正确做法是先查当前项目基于哪个
drupal/recommended-project版本:看composer.json里"drupal/recommended-project"的 require 版本(如"^10.2") - 然后运行
composer update drupal/recommended-project --with-all-dependencies(--with-all-dependencies很关键,否则子依赖可能卡住) - 升级后务必检查
web/core/lib/Drupal/Core/Version.php中的VERSION常量,这是真实核心版本
升级前必须手动备份和清理哪些东西
Drupal 核心升级不是纯 Composer 操作,webroot 下的文件(尤其是 web/core/ 和 web/modules/contrib/)可能残留旧符号链接或未提交变更,导致行为不一致。
使用场景:从 Drupal 10.1 升到 10.2,或跨小版本时最易出问题。
- 删掉
web/core/目录(别怕,它由drupal/core-composer-scaffold自动重建) - 确认
web/sites/default/settings.php没有硬编码 core 路径(比如$settings['hash_salt']之外的路径修改) - 清空
web/sites/default/files/php/和var/cache/(缓存残留可能让旧类继续加载) - 运行
git status看web/core/是否被 git 跟踪——如果被跟踪,git restore web/core再删,否则 scaffold 会失败
为什么 vendor/drupal/core 和 web/core 版本对不上
vendor/drupal/core 是 Composer 安装的源码包,而 web/core/ 是通过 drupal/core-composer-scaffold 插件从 vendor 复制/符号链接过去的。两者版本不一致,说明 scaffold 没生效或被跳过。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
性能影响:若 web/core/ 是旧版本,会导致路由、事件订阅等核心机制行为异常,且 drush cr 可能静默失败。
- 检查
composer.json中是否含"drupal/core-composer-scaffold": "^10"且已安装(composer show drupal/core-composer-scaffold) - 确认
composer install或update输出里有 “Scaffolding files…” 行;没有?加-v看详细日志 - Windows 用户注意:默认禁用符号链接,需在
composer.json的 scaffold 配置里设"symlinks": false,否则复制失败
升级后 drush cr 报 Class 'DrupalCoreStringTranslationTranslatableMarkup' not found
这是典型的 autoloader 混乱:旧核心类还在 OPcache 或 Composer dump-autoload 缓存里,或 vendor/autoload.php 没重生成。
兼容性影响:PHP 8.2+ 下更频繁,因类加载顺序更严格。
- 先跑
composer dump-autoload -o(强制优化 autoload) - 再清 OPcache:
drush php-eval "opcache_reset();"或重启 PHP-FPM - 检查
vendor/composer/autoload_psr4.php是否包含"Drupal\Core\" => array($vendorDir . "/drupal/core/src"),路径指向的必须是新版本的src/ - 如果仍失败,临时删掉
vendor/composer/autoload_*.php,再composer install重建
最常被忽略的是 OPcache —— 它不会自动感知文件变化,尤其在 CLI 和 Web SAPI 不共享缓存时,drush cr 看似成功,实际加载的还是旧类。










