repositories必须写在composer.json顶层,嵌入config或extra等字段无效;私有包name须与require中完全一致(大小写、分隔符逐字符匹配),否则Composer根本不会尝试拉取。

composer.json里repositories必须写在顶层
Composer只认repositories字段在composer.json根层级的写法,塞进config、extra或require-dev里等于没写。它不会报错,但私有包永远“看不见”。
混合加载的关键是让Composer先查私有源,再 fallback 到Packagist。默认行为就是如此——只要repositories数组里有匹配的包名,它就不会去Packagist找;没匹配上,才继续走公共仓库。
- 多个私有源按数组顺序排列,前面的优先级更高;同名包以第一个命中为准
- 如果同时用了
vcs和composer类型(比如Satis),建议把composer源放前面,性能更好 - 别加
"packagist.org": false除非真要完全屏蔽公共源——否则会连monolog/monolog这种基础包都装不上
auth.json权限和结构必须严格匹配域名
Composer不读系统Git凭据,也不走SSH agent,只认auth.json文件,且只在两个位置生效:项目根目录下(优先)或~/.composer/auth.json(全局)。路径错、权限错、key写错,全白搭。
常见错误现象:Could not fetch https://gitlab.example.com/api/v4/projects/... 或直接跳过认证走匿名请求。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 文件权限必须是
600:chmod 600 auth.json,否则Composer直接忽略 - key必须是纯域名,不含协议、端口、路径,例如
"gitlab.example.com"✅,"https://gitlab.example.com"❌ - HTTP Basic认证填
http-basic段,Token填password字段;GitLab用glpat-开头的PAT,GitHub用ghp_开头的token - 验证是否生效:跑
composer install -v,日志里得出现Reading composer.json of vendor/package和GET https://...请求行
私有包自己的autoload必须显式声明
装进vendor ≠ 能new出来。Composer的自动加载映射只在composer install或composer dump-autoload时生成,且完全依赖私有包自身composer.json里的autoload段。
如果私有包没配autoload,哪怕代码下载成功,vendor/autoload.php也压根不知道该从哪加载类。
- PSR-4是最常用方式,例如:
"psr-4": {"MyOrg\Utils\": "src/"} - 命名空间末尾的
\不能漏,路径src/结尾的/也不能少 - 包名大小写必须和
require里完全一致:"myorg/utils"≠"MyOrg/utils" - 改完私有包的
composer.json后,要在主项目里执行composer update myorg/utils,否则autoload不会刷新
本地开发用path仓库+symlink需手动触发
想边改私有包边调试?用path类型仓库配合symlink最方便,但Composer默认不创建符号链接——它只在composer install --prefer-source或composer update时,且配置了"options": {"symlink": true}才尝试。
Windows用户尤其容易卡在这步:没有管理员权限运行终端,mklink失败,但Composer不会报错,只会静默回退到复制模式。
-
repositories里写法示例:{"type": "path", "url": "../my-common-utils", "options": {"symlink": true}} - 确保
../my-common-utils存在、可读写,且其composer.json中name与require字段完全一致 - 已有
vendor/myorg/utils时,先删掉再install,否则Composer跳过symlink步骤 - 改完本地私有包代码后,不用重装,
vendor/autoload.php能直接加载新逻辑——前提是autoload映射本身没变
composer.json里name字段和主项目require中的写法,必须逐字符一致——包括大小写、分隔符、前后空格。这个细节一旦出错,Composer连“尝试拉取”的动作都不会做。

















