composer install 报“package not found”通常因包不在packagist官方源,需在composer.json中配置repositories(vcs或package类型),并确保url可访问、autoload声明正确,之后运行composer clear-cache和dump-autoload。

composer install 报错 “package not found” 却确认包存在
常见于想装非 Packagist 官方源的 SDK,比如公司内网 git 仓库、github 私有库、或 ZIP 包形式的第三方 SDK。Composer 默认只查 packagist.org,找不到就直接报错,不提示你缺配置。
- 先确认包是否真在 Packagist:访问
https://packagist.org/packages/{vendor}/{package}看能否打开 - 如果包在 GitHub 私有仓库,必须在
composer.json里加repositories块,类型设为vcs,URL 指向 Git 地址(支持 https/ssh) - 若包只有 ZIP 下载链接(无 composer.json),不能直接
require,得先用package类型手动声明元信息 - 执行
composer install前务必运行composer clear-cache,否则旧缓存可能掩盖新仓库配置
用 repositories type=package 手动引入 ZIP SDK
适用于厂商只提供一个带 autoload 的 ZIP 包、没托管到任何 Git 平台的情况。这不是“绕过 Composer”,而是告诉它:“这个 ZIP 就是包,按我说的 autoload 规则加载”。
- 在项目根目录
composer.json的repositories数组里加一项,type设为package -
package对象里必须包含name(格式vendor/name)、version、dist(含url和type,如zip)、autoload(PSR-4 或 classmap) -
url必须可被curl -I访问通,且返回200 OK;若需鉴权,用http-basic配置全局凭据 - 加完后运行
composer require vendor/name:dev-master(版本号要和你声明的version一致)
{ "repositories": [ { "type": "package", "package": { "name": "thirdparty/sdk", "version": "1.2.0", "dist": { "url": "https://example.com/sdk-1.2.0.zip", "type": "zip" }, "autoload": { "psr-4": { "ThirdPartySdk": "src/" } } } } ] }
require-dev 里加 SDK 导致生产环境也下载
很多人把调试用的 SDK 放进 require-dev,结果上线时 composer install --no-dev 仍被拉下来——因为它的依赖链被主包间接 require 了。
- 检查该 SDK 是否被其他已安装包的
composer.json在require字段里声明过(哪怕只是 dev 版本) - 运行
composer depends thirdparty/sdk查谁依赖它;若输出非空,说明它已是传递依赖,--no-dev无效 - 临时解决:用
replace在根composer.json中声明"thirdparty/sdk": "*",骗 Composer 认为它已存在 - 长期方案:让 SDK 维护者把开发专用功能拆到独立包,主包只保留运行时必需部分
autoload 失效:类找不到但文件路径明明对
尤其是 ZIP 引入后,new ThirdPartySdkClient() 报 Class not found,但文件确实在 vendor/thirdparty/sdk/src/Client.php。
- 确认
composer.json里autoload的命名空间前缀和实际 PHP 文件的Namespace完全一致(包括大小写) - 运行
composer dump-autoload -o强制重生成优化后的 autoloader;别信 ide 缓存,CLI 下跑一遍最准 - 如果 SDK 用
classmap,确保src/目录下所有 PHP 文件都可被扫描到(无 .gitignore 排除、无 symlink 循环) - 检查是否误用了
autoload-dev:它只在require-dev包中生效,主项目代码无法使用其中定义的类
有些 SDK 的 composer.json 里写了 autoload,但你手动 ZIP 引入时没复制它,就得自己补全——这步漏掉,后面所有操作都是白忙。