自定义源不生效的根本原因是项目级repositories数组会默认关闭隐式packagist.org源,需显式添加{"type":"composer","url":"https://packagist.org","packagist":false}或全局执行composer config -g packagist false;vcs类型url必须是可git clone的地址且含.git后缀;私有composer服务必须设"type":"composer"且url能返回packages.json。

自定义源不生效,根本原因往往是 packagist.org 没关掉
只要你在 composer.json 里加了 repositories 数组,Composer 就会默认关闭隐式 packagist.org 源——但这个“关闭”只对新声明的源生效,旧行为残留极容易被忽略。结果就是:你配了私有 Git 仓库,composer require myorg/internal-sdk 还是去 Packagist 查,报 Could not find package。
必须显式禁用:
- 在项目级
composer.json的repositories里,加一条:{"type": "composer", "url": "https://packagist.org", "packagist": false}(注意不是删掉,而是设"packagist": false) - 或全局执行:
composer config -g packagist false(慎用,影响所有项目) - 更稳妥的做法:把私有源放在
repositories数组最前面,再手动加回 packagist 作为兜底(带"packagist": false标记)
vcs 类型配错 URL,Composer 会静默 clone 失败
填 "type": "vcs" 时,url 必须是可直接 git clone 的地址,比如 https://gitlab.example.com/myorg/sdk.git。常见错误:
- URL 指向 GitHub 的某个 tag 页面(如
https://github.com/myorg/sdk/releases/tag/v1.2.0)→ Composer 不会解析 HTML,直接失败 - URL 少了
.git后缀(部分 Git 服务允许省略,但 Composer 要求严格匹配) - 用了 HTTPS + token 拼接写法(如
https://token:x-oauth-basic@github.com/...)→ 不安全且 Composer 1.10+ 已弃用,凭据必须走auth.json
验证方式:手动 git clone https://gitlab.example.com/myorg/sdk.git 能否成功;再确认该仓库 main 分支根目录下有合法 composer.json,且其中 "name" 字段为 myorg/sdk(两段式,不能是 sdk 单段)。
require 时版本写法必须和 vcs 仓库实际结构匹配
Git 仓库不靠 packages.json 提供版本列表,而是靠分支名、tag 名动态解析。所以 composer require 的版本字符串,得对应上真实存在的 Git 引用:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
dev-main→ 要求仓库存在main分支,且其composer.json中"version"字段可为空(Composer 自动识别为 dev 版本) -
v1.2.3→ 要求仓库有对应 tag,且该 tag 指向的composer.json中"version"必须严格等于"1.2.3"(不能是"v1.2.3"或"1.2.3-beta") -
dev-feat/login#abcd123→ 支持 commit hash,但需确保该 commit 在远程可访问,且其composer.jsonname 正确
如果仓库没设 main 分支,而默认是 develop,那就必须写 dev-develop,否则报 Could not find a branch or tag matching 'dev-main'。
私有 Composer 服务(如 Satis)必须配 type: composer
如果你搭的是 Satis、Private Packagist 或阿里云镜像这类提供 packages.json 的 HTTP 服务,type 只能是 composer,绝不能写成 vcs。否则 Composer 会尝试 git clone 一个 HTML 页面,报错类似 Cloning into '/tmp/...'... fatal: repository 'https://satis.internal/' does not exist。
正确写法:
{
"repositories": [
{
"type": "composer",
"url": "https://satis.internal"
}
]
}
关键点:
-
url必须能直接返回 JSON(如访问https://satis.internal/packages.json有响应) - 该服务必须已生成索引,且你要装的包已出现在
providers列表中 - 若服务需要认证(如 Basic Auth),同样走
auth.json,而非拼 URL
顺序、type、packagist 开关这三件事漏掉任何一环,自定义源就只是个摆设——它不会报错,只会安静地跳过。










