composer 不发布包,仅消费包;私有包需在项目 composer.json 中声明 repositories(type: "vcs",url 可 clone),并确保 auth.json 位置权限正确、版本对应 git tag/分支,内网需禁用 packagist.org 回退。

composer 本身不“发布”包,它只消费包;真正要让私有包可被 composer require 安装,必须走「源注册 + 版本可发现」路径。直接 push 到 Git 仓库 ≠ 可安装,漏掉任一环节都会报 Could not find package。
为什么在 Git 仓库里提交了代码,composer require 还是找不到?
因为 Composer 默认只查 packagist.org,对你的私有 Git 地址完全无感。它不会主动扫描、解析或信任任意 URL —— 即使你把 composer.json 放得再规范,没显式告诉它“去哪找”,它就当不存在。
- 常见错误:只改了自己私有库的
composer.json(比如写了"name": "acme/utils"),却忘了在业务项目的composer.json里加repositories声明 -
repositories必须是项目根目录下composer.json的顶层字段,不能嵌套在config或其他地方 - type 必须写
"vcs",不是"git"、"package"或留空;写错就静默忽略 - URL 必须是可
git clone的地址(如https://gitlab.example.com/acme/utils),不能是网页链接,也不建议带.git后缀(虽部分情况 fallback,但官方明确建议省略)
auth.json 配置失败的 90% 原因
HTTPS 方式拉取私有 Git 仓库时,认证失败往往不是 Token 错,而是 auth.json 没放对位置、权限不对或结构非法。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 文件必须放在项目根目录(
./auth.json)或COMPOSER_HOME目录(通常是~/.composer/auth.json),优先级:项目级 > 全局级 - 权限必须是
600(Linux/macOS),chmod 600 auth.json,否则 Composer 直接跳过读取,且不报错 - 内容必须是标准 JSON,外层是对象:
{"http-basic": {"gitlab.example.com": {"username": "oauth2", "password": "glpat-xxx"}}},http-basic和github-oauth是并列字段,不能嵌套 - GitLab 实例填域名(
"gitlab.example.com"),不是完整 URL;GitHub 推荐用github-oauth字段,Token 需含read:packages权限 - SSH 方式完全不走
auth.json,靠系统ssh-agent和密钥,auth.json存在也无效
版本号写 dev-main 还是 v1.0.0?
Composer 对 VCS 类型仓库,只认 Git tag 和分支名作为版本,完全忽略私有库 composer.json 里的 version 字段。写错版本约束,就会卡在“找不到满足条件的版本”。
- 没打任何 tag 的仓库,唯一可用版本是
dev-main(或dev-master),但需确保根composer.json里有"minimum-stability": "dev",否则默认跳过 - 想用
"^1.0"这类约束,必须打语义化 tag(v1.0.0、v1.1.0),且前缀v要一致;v1.0或1.0.0不被识别为有效版本 - 分支名如
feature/login不算稳定版,require 时得写"dev-feature/login",同样依赖minimum-stability: dev - 调试用:
composer show acme/utils --all查看当前能识别出的所有版本(tag/branch),比瞎猜快得多
内网离线场景下,怎么确保 composer install 绝对不碰公网?
关键不是断网,而是彻底切断 Composer 对 packagist.org 的任何回退可能。配置没闭环,它会在超时后自动 fallback,导致 CI 失败或暴露内网请求。
- 执行
composer config repo.packagist composer https://your-intranet/packagist/替换默认源 - 立刻补上
composer config --global repo.packagist false,禁用全局 fallback - 检查
composer.json中不能有"type": "package"或"dist"指向公网 URL 的条目,这类定义会绕过源配置直连下载 - 私有源根路径下必须存在可访问的
packages.json,curl -I https://your-intranet/packagist/packages.json返回 200,且响应头含Content-Type: application/json - HTTPS 自签名证书场景,PHP 的
openssl.cafile必须包含内网 CA 根证书,否则 cURL 层静默失败,Composer 只无限等待
"skip-dev": true,会把 require-dev 里的测试工具也打进 dist 包,导致体积暴涨;而 GitLab/Gitee 的 Package Registry 虽然能托管 .zip,但 Composer 默认仍走源码方式,除非你手动配 dist —— 这种配置极难维护,不推荐。










