Composer不提供原子重命名命令,需手动修改composer.json的name字段、autoload命名空间、PHP文件namespace及CI/CD脚本,并立即执行composer dump-autoload -o更新映射。

Composer 本身不提供“原子命名”或“重命名”项目/包的命令 —— 它不管理项目名称的语义变更,只认 composer.json 里声明的 name 字段。所谓“重命名”,本质是手动编辑配置 + 清理残留 + 保证自动加载一致性。
为什么改了 composer.json 的 name 字段却没效果
因为 name 字段仅用于 Packagist 发布、依赖解析和项目标识,不参与运行时逻辑。但以下场景会暴露问题:
- 你在 Packagist 上发布过旧
name,别人require了它,现在想迁移到新名 → 这不是 Composer 能自动处理的,需手动维护别名或废弃旧包 - 你用
composer create-project old-vendor/old-name初始化,改完name后仍被当成旧包引用 → 因为create-project复制的是源代码,不重写元信息 -
autoload映射仍指向旧命名空间,类加载失败 → 命名空间和目录结构没同步更新
重命名项目时必须同步修改的 4 个地方
漏掉任意一项都可能导致类找不到、脚本报错或 CI 失败:
-
composer.json顶层"name"字段:比如从"acme/blog"改成"acme/cms" -
composer.json中"autoload"和"autoload-dev"的 PSR-4 命名空间前缀:如"App\": "app/"若对应旧 vendor 名,应改为"Acme\Cms\": "app/"(并同步改 PHP 文件里的namespace) - 所有 PHP 文件顶部的
namespace声明:不能只改composer.json,否则composer dump-autoload生成的映射仍指向错误路径 - CI/CD 脚本、Dockerfile、部署文档中硬编码的包名或路径:比如
composer require acme/blog要替换成新名,否则安装失败
post-create-project-cmd 脚本如何安全做模板重命名
如果你在写 project 类型模板("type": "project"),想让用户执行 composer create-project vendor/name 后自动把占位符(如 vendor/name)替换成实际值,必须靠 post-create-project-cmd 脚本,但要注意:
- 脚本必须定义在**模板包自身的
composer.json根"scripts"下**,且名称严格为"post-create-project-cmd" - 脚本运行时工作目录是**新项目根目录**,原始模板文件已复制完毕,不可读取模板源码中的文件
- 推荐用 PHP 脚本而非 shell:避免跨平台路径问题,例如用
str_replace(file_get_contents('composer.json'), 'VENDOR_NAME', $inputVendor)替换占位符 - 不要直接重命名
vendor/目录或改composer.lock—— 这些是 Composer 管控区,强行修改会导致后续install冲突
最易被忽略的一点:重命名后必须立刻执行 composer dump-autoload -o,否则即使 namespace 和文件结构全对,PSR-4 映射缓存仍是旧的,Class not found 错误照常出现。











