Composer报“Package not found”是因repositories配置被静默忽略,常见原因包括type非"vcs"、URL含分支后缀、repositories为空或缺{"packagist.org": false}。

Composer报“Package not found”但私有仓库URL能手动clone通
这不是缓存问题,是 repositories 配置被 Composer 静默忽略——它根本没去你的私有源查,而是直接 fallback 到 Packagist 并失败。
常见原因包括:
-
type写成"git"或"github",必须是"vcs" -
url末尾带#main、/-/tree/main或网页路径,应只保留纯 clone 地址,如https://gitlab.example.com/org/pkg.git - 整个
repositories数组是空对象{}或含非法字段(比如拼错的"packagist": false),Composer 会直接跳过整块配置 - 没加
{"packagist.org": false}兜底项,导致即使配了私有源,Composer 仍优先查官方源并“抢答”失败
为什么 composer clear-cache 后还是拉不到私有包
composer clear-cache 只清 ~/.composer/cache/files/、repo/ 和 vcs/,但对私有 VCS 包无效——因为 Composer 拉 VCS 包时,不走 dist 缓存,而是直接 git clone;如果 clone 失败,它不会报 Git 错误,而是静默 fallback 并报 “Package not found”。
真正要验证的不是缓存,而是凭据和连接:
- 手动运行
git clone https://gitlab.example.com/org/pkg.git(HTTPS)或git clone git@gitlab.example.com:org/pkg.git(SSH),看是否卡住或提示could not read Username/Permission denied (publickey) - SSH 方式下,运行
ssh-add -l确认密钥已加载;若为空,执行ssh-add ~/.ssh/id_ed25519(路径按实际调整) - HTTPS 方式下,确保已启用凭据管理:
git config --global credential.helper store,然后手动跑一次git clone输入账号密码完成缓存
确认私有包配置是否真生效的三步验证法
别信 composer.json 里写了就等于起作用。Composer 对配置极其敏感,错一个字段就静默失效。
运行以下命令逐层验证:
- 查项目级源是否加载:
composer config repos(不加-g),输出里必须出现你配的私有源 URL 和"type": "vcs" - 查包是否真从私有源解析:
composer show vendor/package,输出中source行必须是vcs https://...,而不是dist或压根不显示source - 加详细日志看实际行为:
composer require vendor/package -vvv,日志里应出现Reading package information from https://gitlab.example.com/org/pkg.git,而不是Skipping repository ... due to missing type或直接跳到Loading composer repositories
本地改了私有包代码但 composer update 不生效
这大概率是你用的是 "type": "vcs",但期望它像 "type": "path" 那样实时响应本地修改——它不会。VCS 模式下,Composer 每次都按 version 或 branch 去远端 fetch,本地改了没用。
想快速验证本地变更,必须切换为 path 模式:
- 临时把
repositories改成:{"type": "path", "url": "../my-package"} - 删掉
vendor/vendor/package目录(不是整个vendor) - 删掉 Composer 的 Git 缓存:
rm -rf ~/.composer/cache/vcs/*(Linux/macOS)或对应 Windows 路径 - 运行
composer update vendor/package --no-cache,日志里应出现Reading ./../my-package/composer.json - 注意:改回 VCS 前,务必删掉
vendor/下的 symlink,否则自动加载器仍指向旧路径
ssh-add -l 和 composer config repos ——很多人花半小时调镜像、清缓存,却没花十秒确认密钥是否加载、配置是否真的被读进去了。


















