根本原因是加了repositories数组后Packagist被隐式关闭且未显式补回,必须添加{"type":"composer","url":"https://packagist.org","packagist":false}并置于数组末尾兜底。

composer.json里加了repositories却找不到私有包
根本原因不是配置写错了,而是 Packagist 被隐式关闭后没手动补上——只要你加了 repositories 数组,Composer 就默认停用 packagist.org 的自动查找,但不会报错,只会静默跳过。
结果就是:你写了 "type": "vcs" 指向私有 Git 仓库,composer require myorg/sdk 却仍去 Packagist 查,报 Could not find package。
- 必须在
repositories数组里显式加回 Packagist,并带上"packagist": false标记,例如:{ "type": "composer", "url": "https://packagist.org", "packagist": false } - 更稳妥的顺序:把私有源放数组最前面,再追加带
"packagist": false的 Packagist 条目,确保兜底行为可控 - 全局禁用(
composer config -g packagist false)慎用,会影响所有项目,CI 环境尤其容易出问题
vcs类型URL为什么git clone失败却没提示
Composer 对 "type": "vcs" 的 URL 要求非常严格,且错误是静默的:它不会告诉你“URL 不合法”,而是直接 fallback 到下一个源,或者干脆失败。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- URL 必须是能直接
git clone的地址,例如https://gitlab.example.com/myorg/sdk.git;不能是 GitHub Release 页面、GitLab tag 页面等 HTML 地址 - 必须带
.git后缀,即使 Git 服务本身支持省略(如https://github.com/myorg/sdk→ 错,https://github.com/myorg/sdk.git→ 对) - HTTPS + token 拼接(如
https://token:x-oauth-basic@github.com/...)已弃用,凭据必须走auth.json或环境变量 - 验证方式很简单:在终端执行
git clone https://your-url.git,能成功 clone 下来,Composer 才可能成功
require时写dev-main或v1.2.3却安装失败
Git 仓库不靠 packages.json 提供版本列表,而是靠分支名、tag 名实时解析。所以 require 的版本字符串必须和 Git 引用严格匹配,且目标 commit 的 composer.json 里 name 和 version 也得对得上。
-
dev-main→ 要求仓库存在main分支,且该分支根目录下composer.json的"name"是两段式(如"myorg/sdk"),"version"字段可为空 -
v1.2.3→ 要求仓库有名为v1.2.3的 tag(不是1.2.3,也不是release/v1.2.3),且该 tag 指向的composer.json中"version"必须精确等于"1.2.3"(不能是"v1.2.3"或"1.2.3-beta") - 如果用了
require-all: true的 Satis 仓库,版本由 Satis 扫描生成,此时应检查 Satis 构建后的packages.json是否真包含该版本条目
用 Artifactory 或 Satis 做私有源时的关键配置点
这类服务本质是 "type": "composer" 的远程仓库,配置简单但权限和代理逻辑容易漏掉。
- Artifactory:推荐用虚拟仓库聚合本地 + 远程(Packagist 代理),项目中只配一个虚拟仓库 URL;避免直接配本地仓库,否则无法 fallback 到公共包
- Satis:构建命令
php bin/satis build satis.json web/生成的是静态文件,必须确保 Web 服务器能正确返回packages.json的 MIME 类型(application/json),否则 Composer 解析失败 - 无论哪种,认证都不要写在
composer.json里;统一走auth.json(路径COMPOSER_HOME/auth.json),格式为:{ "http-basic": { "repo.example.com": { "username": "xxx", "password": "yyy" } } } - CI/CD 环境中,
auth.json需通过 secret 注入,不能硬编码或提交到 Git
name 字段是否与 require 的包名完全一致,以及 Artifactory/Satis 的 HTTP 响应头是否合规——这两处不报错,但会让整个流程卡在“找不到包”或“解析空响应”。

















