本地包生效需满足三要素:主项目 repositories 正确声明 path 仓库、本地包 composer.json 含合法 name 和完整 autoload 配置、PSR-4 前缀/namespace/路径三者逐字符一致;否则 Class not found。

本地包的命名空间配置不是“写对就能用”,而是必须让 composer.json 的 psr-4 前缀、类文件里的 namespace 声明、实际文件路径三者逐字符完全一致,缺一不可;否则 new 实例时直接抛 Class not found。
psr-4 前缀末尾必须带双反斜杠
比如你想让 MyCompanyUtilsStringHelper 映射到 src/Utils/StringHelper.php,composer.json 中必须写成:
"autoload": {
"psr-4": {
"MyCompany\Utils\": "src/"
}
}
常见错误包括:
-
"MyCompanyUtils":单反斜杠在 JSON 中会被转义,解析失败 -
"MyCompanyUtils":末尾没反斜杠,MyCompanyUtilsHelper就匹配不到src/Helper.php -
"MyCompany\Utils":少一级分隔,MyCompany\Utils\StringHelper不会映射到src/Utils/StringHelper.php
本地包的 composer.json 必须有合法 name 和 autoload
本地包根目录下的 composer.json 不仅要声明 name(如 "mycompany/utils"),还必须包含正确的 autoload 配置。Composer 在扫描 path 仓库时,会跳过任何缺少 name 或语法错误的包,且不报错。
关键点:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
name必须和你在主项目中执行composer require时写的完全一致(大小写敏感) - 如果本地包没有
version字段,主项目需设"minimum-stability": "dev",否则dev-main这类分支名会被过滤 -
autoload必须存在且格式正确;空配置或只写"psr-4": {}等同于没配
主项目必须通过 repositories 声明 path 类型仓库
主项目的 composer.json 根级必须有 repositories 数组,且 type 为 "path",url 是相对于该 composer.json 的相对路径(如 "./packages/my-utils")。
典型错误配置:
- 把
repositories写进require或autoload字段里 —— 完全无效 -
url写成绝对路径(/home/user/packages/my-utils)或带file://协议 —— 多数环境静默失效 - 只写一个仓库却漏掉数组包装:
"repositories": { "type": "path", ... }→ 正确应为"repositories": [{ "type": "path", ... }]
dump-autoload 不解决路径未识别或命名空间不一致
运行 composer dump-autoload 只是刷新自动加载器缓存,它不会让一个没被 Composer 认出的本地包突然生效,也不会修复命名空间拼写错误。
真正起作用的顺序是:
- 主项目
composer.json声明了repositories→ Composer 才会去扫描那个路径 - 扫描到本地包的
composer.json且验证通过 → 才会读取它的autoload规则 - 安装后,
vendor/autoload.php合并主项目 + 本地包的 PSR-4 映射 →dump-autoload生效
所以如果 Class not found,先确认 vendor/mycompany/utils 目录是否存在(符号链接是否建立),再查命名空间三件套是否对齐 —— 这比反复 dump-autoload 有用得多。

















