composer是php依赖声明与自动加载协调器,非包管理器;发布扩展包需先确保github仓库公开、composer.json含合法name(vendor/package)、type=library、psr-4 autoload、license为spdx标识符,并打v前缀语义化tag(如v1.0.0)触发packagist索引。

Composer 不是包管理器,它是 PHP 的依赖声明与自动加载协调器;想靠它“发布扩展包”,得先搞清它只管安装和 autoload,不负责注册、分发或版本托管。
composer.json 必须写对的五个字段
很多人以为 name 只要不重名就行,其实它必须是 vendor/package 格式(如 myorg/my-sdk),且 vendor 名需与 Packagist 账户或 GitHub 组织名一致,否则 composer require myorg/my-sdk 会 404。
-
type设为library(不是package或空)——否则 Packagist 无法识别为可复用库 -
autoload必须含psr-4映射,例如{"MyOrg\MySdk\": "src/"};路径末尾斜杠不能漏,"src"和"src/"在某些 Composer 版本下行为不同 -
require里不要写"php": "^8.1"这类运行时约束——它只影响 install 时检查,不参与 autoloading,但若写错(如"^7.4")会导致 CI 中低版本 PHP 直接失败 -
license值必须是 SPDX 标准标识符(如"MIT"),写成"MIT License"会被 Packagist 拒绝
PSR-4 自动加载失效的三个典型原因
跑 composer dump-autoload 没用?大概率不是命令问题,而是结构或配置没对齐。
- 命名空间声明与目录结构不严格对应:比如
src/Http/Client.php里写了namespace MyOrgMySdkHttp;,但composer.json里映射的是{"MyOrg\MySdk\": "src/"}—— 正确,但如果写成{"MyOrg\MySdk\Http\": "src/Http/"}就会导致MyOrgMySdkHttpClient找不到 - 文件名大小写混用:Linux 下
client.php和Client.php是两个文件,但 PSR-4 要求类名首字母大写,文件名必须完全匹配(Client.php) - 存在未声明的子命名空间:比如代码里用了
MyOrgMySdkContractsHttpClient,但composer.json没覆盖Contracts目录,autoload 就不会扫描它
发布到 Packagist 的实际流程(非一键提交)
Packagist 不拉取代码,它只抓取你 GitHub/GitLab 仓库的 tag;所以“发布”本质是打 tag + 触发 hook。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先确保远程仓库公开,且 Composer 配置已提交(
composer.json在根目录) - 本地打语义化版本 tag:
git tag -a v1.0.0 -m "Release v1.0.0",然后git push origin v1.0.0 - 登录 Packagist,点击 “Submit” 输入仓库 URL(如
https://github.com/myorg/my-sdk),它会立即抓取最新 tag 并索引 —— 若失败,看错误日志里是否提示composer.json not found或 license 不合法 - 后续新版本只需打新 tag 并 push,Packagist 会自动更新(前提是仓库保持关联状态)
本地开发调试时绕过 Packagist 的方法
不想每次改一点都 push tag?用 path repository 最直接。
在你的测试项目 composer.json 的 repositories 字段加:
{
"repositories": [
{
"type": "path",
"url": "../my-sdk"
}
],
"require": {
"myorg/my-sdk": "*"
}
}
注意:url 是相对于当前 composer.json 的路径;"*" 会命中本地最新 commit,无需 composer update 即可实时看到改动效果。但别忘了上线前删掉这个 repositories 块,否则线上环境会试图从本地路径加载。
PSR 标准本身不难,难的是每个环节都卡在细节上:命名空间斜杠、tag 推送顺序、autoload 路径末尾符号、Packagist 的缓存延迟……这些地方错一个,就卡在“明明写了却加载不到”。










