能被composer require正常安装的包必须满足4个硬性条件:name为vendor/name格式且大小写敏感;type显式设为library;autoload显式声明psr-4并注意双反斜杠与路径斜杠;license字段不可省略(如"mit")。

能被 composer require 正常安装的包,90% 的问题出在 composer.json 配置和自动加载规则上,而不是代码本身。
composer.json 必须满足这 4 个硬性条件
Packagist 不校验代码,只认这几个字段是否合规:
-
name必须是vendor/name格式(如myorg/http-client),不能是http-client或MyOrg/HttpClient(大小写敏感、斜杠位置固定) -
type显式设为library(设成project或留空会被过滤) -
autoload必须显式声明 PSR-4,且注意命名空间末尾双反斜杠和路径结尾斜杠都要有:{"psr-4": {"MyOrg\HttpClient\": "src/"}} -
license字段不可省略(填"MIT"最稳妥;缺了 Packagist 直接拒收)
本地开发时怎么边写边测,不发版也能 require
反复 push → 等同步 → composer update 太慢。用 path 类型仓库:
- 在主项目
composer.json的repositories里加一段:{"type":"path","url":"../my-http-client"} - 执行
composer require myorg/http-client:dev-main(注意用实际分支名,不是dev-master) - 改完包代码后,在主项目里只需
composer update myorg/http-client,无需提交、打 tag - 切记:
path方式仅限开发,上线前必须删掉该repositories条目,否则部署环境会找不到路径
为什么 composer require 找不到你的包
不是 GitHub 地址错了,而是 Packagist 没同步或没权限抓取:
- 首次发布必须手动去 https://www.php.cn/link/16d40a3be745187190a9683cc8a9e1c0 提交仓库 URL,没有“自动发现”这回事
- 确保 GitHub 仓库是公开的;私有仓库需提前配置
composer config --global github-oauth.github.com <token></token> - 改过
name后本地缓存会卡住——删掉主项目里的vendor/和composer.lock,再运行composer clear-cache - 错误信息里出现
Could not parse version constraint?,大概率是composer.json里写了死版本号"version": "1.0.0",删掉它,版本靠 Git tag 控制
Class not found 的真实原因不是 autoload 没刷新
composer dump-autoload 只刷新映射,它不解决三类根本问题:
- 包根本没被
require安装(composer show myorg/http-client看是否列出) - 路径未被识别(
repositories配错、url是绝对路径或跨出项目根目录) - 命名空间与
autoload声明不一致(改了类文件位置或命名空间,但没同步更新composer.json中的psr-4规则)
每次修改包的 autoload 或类路径,都需先 composer remove myorg/http-client,再 require 重装;开发阶段建议关闭优化:"optimize-autoloader": false,避免 -o 缓存干扰调试。











