本地包的autoload配置必须写在自身composer.json中,主项目配置对其无效;需确保含"psr-4": {"Acme\Utils\": "src/"}(双反斜杠+正斜杠结尾),且主项目repositories中正确声明path仓库并验证symlink生效。

本地包的 autoload 配置必须写在自己 composer.json 里
主项目的 autoload 对本地包完全无效。你改了主项目里的 "psr-4": {"App": "app/"},本地包里的类照样不会被加载——Composer 加载类时,只读取该包自身 composer.json 中的 autoload 段。
常见错误是只配了主项目,却忘了在本地包根目录下也放一份合法的 composer.json,且必须包含:
-
"autoload"字段,例如:"psr-4": {"Acme\Utils\": "src/"} - 命名空间末尾双反斜杠
\不可省略("Acme\Utils\"✅,"Acme\Utils"❌) - 路径用正斜杠结尾(
"src/"✅,"src"或"./src/"❌) - 路径是相对于本地包根目录的,不是主项目根目录
path 仓库配置必须在主项目 composer.json 顶层
repositories 字段不能嵌套在 autoload、require 或其他字段里,必须是主项目 composer.json 的顶层键。格式必须是数组,且 url 是相对路径:
- 正确:
"url": "../my-utils"(推荐)或"url": "./packages/my-utils" - 错误:
"url": "file://../my-utils"、"url": "~/my-utils"、"url": "..\my-utils"(Windows 反斜杠未转义) - 路径末尾带
/会被 Composer 完全忽略该仓库,例如"url": "../my-utils/"
目标目录(如 ../my-utils)下必须有合法 composer.json,含 "name" 和可识别版本(如 "dev-main"),且该目录需已执行 git init 并至少有一个 commit。
symlink 没生效会导致改代码不生效
类找不到或改了代码没反应,大概率是因为 vendor/vendor/name 不是符号链接,而是静态副本。Composer 在 symlink 失败时会静默 fallback 到 copy 模式,不报错也不提示。
- Linux/macOS 验证:
ls -la vendor/vendor/name,看到->才是链接成功 - Windows 验证:
dir vendorendor ame,看到JUNCTION或SYSM类型才是链接 - 关键配置不在主项目,而在**本地包自己的
composer.json** 中:必须有"options": {"symlink": true} - Windows 用户必须以管理员身份运行终端;Docker 需加
--cap-add=SYS_ADMIN并确保挂载支持 symlink
dump-autoload 后仍 not found?用 -v 看它到底扫了啥
composer dump-autoload 不联网、不装包,只根据 autoload 配置生成映射。如果类还是找不到,别猜,让它自己说:
- 运行
composer dump-autoload -v,观察输出是否出现你的命名空间前缀(如Acme\Utils\) - 若压根没出现,说明 autoload 配置根本没被读进去:检查 JSON 语法(BOM、多逗号、单引号)、
psr-4键值末尾是否漏了\ - 若出现了但跳过了某些文件,留意提示:可能是文件含 BOM、短标签未启用、或存在
.php.bak这类非法文件卡住解析 - 最终确认映射是否写进
vendor/composer/autoload_psr4.php:搜索你的前缀,看路径是否为绝对路径(如$baseDir . '/src/'),再手动检查该路径下是否存在对应文件
最容易被忽略的是:改完本地包的 autoload 后,必须在主项目中重新运行 composer dump-autoload,否则新映射不会写入 autoload 文件。


















