必须在composer.json根节点设"packagist.org": false以禁用默认源,否则即使配置镜像也会先卡30秒请求官方源;repositories须为数组、URL末尾不带/、私仓需置前且类型正确。

直接用 composer install,别手抖敲 composer update —— 后者会绕过 composer.lock 重算依赖,导致本地和线上版本不一致,autoload 错、函数找不到、CI 构建失败,全是它惹的祸。
为什么换镜像后 composer install 还卡在 packagist.org?
因为没关掉默认源。Composer 默认永远把 packagist.org 当兜底,哪怕你已经在 repositories 里加了阿里云镜像,它仍会优先请求官方源——直到超时(默认 30 秒)才 fallback,体验就是“卡住十几秒后突然动了”。
- 必须在
composer.json根节点写"packagist.org": false,不是塞进repositories数组里 -
repositories必须是 JSON 数组,不是对象;写成{"aliyun": {...}}会导致只生效最后一个 - 镜像 URL 末尾不能带
/packages.json,正确的是"https://mirrors.aliyun.com/composer/" - 国内镜像(如阿里云)偶尔滞后几小时,所以建议把官方源作为第二顺位兜底,而不是删掉
repositories 里混用私仓和镜像,怎么避免包路由失效?
Composer 不是“有多个源就自动分流”,它按数组顺序硬性匹配:第一个源返回 200(哪怕内容为空)就停,后面的同名包根本不会查。私仓包装不上,90% 是因为没控制好这个顺序,或类型配错。
- 私有 Composer 仓库(如 Satis)用
"type": "composer";私有 Git 仓库用"type": "vcs",不能混着写 - 私仓地址必须放在镜像前面,否则同名包会被镜像“抢答”,返回 404 后直接失败,根本不会走到你的私仓
- 如果私仓是 Git 类型,
require时得显式加@dev或指定分支,比如acme/utils:dev-main,否则 Composer 默认只找 stable 版本 - 运行
composer config repositories可确认当前生效的源列表,注意是否被全局~/.composer/config.json覆盖
切换项目时 vendor/autoload.php 报 Class not found 怎么办?
不是代码错了,是上个项目留下的 vendor/autoload.php 被复用了。它的 autoload_static.php 是生成时快照,不会感知当前项目的 composer.json 变更。
- 每次 cd 进新项目前,先确认当前目录下有
composer.json - 删掉旧
vendor/和composer.lock(尤其跨团队、跨稳定性要求的项目) - 不要靠
composer dump-autoload救急——它只刷新 autoloader,不解决源冲突或类路径映射错位 - CI 环境务必用
--no-cache+clear-cache组合,防止元数据缓存污染
最常被跳过的动作是删 composer.lock:它锁的不只是版本,还锁了 dist URL、源类型、甚至包签名。一旦换了私仓或镜像,不重建 lock 文件,install 就永远走老路。


















