Packagist不会自动发现仓库,必须手动提交公开GitHub仓库的HTTPS URL;首次提交前需确保仓库为Public、根目录有含合法name(vendor/package-name)和autoload的composer.json,并配置GitHub webhook(Payload URL为https://packagist.org/api/github)以实现tag推送自动同步。

Packagist 不会自动发现你的仓库,必须手动提交 URL,且首次提交后不配 webhook 就永远收不到新 tag —— 这是 90% 发布失败的根源。
怎么让 Packagist 第一次认出你的 GitHub 仓库
Packagist 根本不扫描 GitHub,它只响应你主动粘贴的 URL。提交前务必确认:
- GitHub 仓库设为 Public(私有库直接报
Repository not found) -
composer.json在仓库根目录,且含合法name字段:全小写、用短横线分隔、格式为vendor/package-name(如myorg/http-client),vendor必须与你在 Packagist 的用户名完全一致 -
type推荐设为library;autoload至少配置psr-4映射(如{"psr-4": {"MyOrgHttpClient": "src/"}}),末尾反斜杠不能漏 - 本地先跑
composer validate,避免语法错误导致提交被拒
提交入口在 packagist.org 右上角 Submit → 粘贴完整 HTTPS 仓库地址(如 https://github.com/myorg/http-client)→ 点 Check。若显示 Invalid package information,八成是 name 格式错或 autoload 路径没对上。
为什么打完 v1.0.0 还是 Could not find package
Packagist 默认只索引 stable 版本,而新仓库首次提交时,所有分支(包括 main)都被视为 dev-main,不是用户 composer require 默认拉的版本。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须推送一个符合 semver 的 Git tag,例如
v1.0.0、v2.1.3;1.0、release-1.0.0、v1.0.0-beta都不算稳定版 - tag 要推到远程:
git tag v1.0.0 -m "First stable release" && git push origin v1.0.0 - 如果没配 webhook,Packagist 不会自动感知这个 tag,页面右上角
Last updated时间不会变,用户执行composer require myorg/http-client:^1.0就会报错 - 临时验证可用
composer require myorg/http-client:dev-main,但别在生产环境用
如何配好 GitHub webhook 实现自动更新
没 webhook = 每次发版都要手动点 Packagist 页面上的 Update,极易漏更。正确配置路径:
- 进 GitHub 仓库 →
Settings→Webhooks→Add webhook -
Payload URL填https://packagist.org/api/github(注意:不是带?username=xxx的旧格式) -
Content type选application/json;Which events...勾选Just the push event或Releases(如果你用 GitHub Releases) - 保存后,去
Recent Deliveries查看状态码:出现200表示成功;404多半是 URL 拼错,403是权限问题
配好后,下次 git push --tags,Packagist 会在几分钟内自动抓取新 tag 并生成对应版本。若仍不更新,检查 tag 名是否带 v 前缀(v2.0.0 可,2.0.0 可能被识别为 dev 版)。
autoload 写错会导致 Class not found 却安装成功
用户 composer require 成功 ≠ 包能用。autoload 错误最隐蔽:类文件明明存在,一调就报 Class 'MyOrgHttpClientClient' not found。
-
psr-4映射必须严格匹配命名空间和目录结构:若类定义为namespace MyOrgHttpClient;,且文件路径是src/HttpClient/Client.php,则 autoload 应为{"MyOrgHttpClient": "src/"} - Windows 下 JSON 中反斜杠要双写:
"MyOrg\HttpClient\";Linux/macOS 用单反斜杠即可,但统一用"MyOrgHttpClient\"更稳妥 - 改完
composer.json后,本地必须运行composer dump-autoload --no-dev验证是否生效,否则缓存还是旧的 - 别把开发依赖(如
phpunit/phpunit)写进require,应移入require-dev,否则用户项目可能因 PHP 版本冲突装不上
真正容易被忽略的是:tag 对应的 commit 必须包含当时有效的 composer.json 和 autoload 配置。如果在打 v1.0.0 后又改了 autoload 映射,但没打新 tag,那 v1.0.0 版本永远按旧配置加载——Packagist 不会回溯修改已发布的版本元数据。

















