项目级 repositories 字段会彻底覆盖全局配置,无论其值为空数组还是完整列表,只要存在该键即完全丢弃全局仓库设置,且不支持合并或优先级叠加。

项目级 repositories 字段会彻底覆盖全局配置,不是合并、追加或优先级叠加——只要项目 composer.json 里定义了该字段,哪怕只写 "repositories": [],全局 ~/.composer/config.json 中的所有仓库设置都会被丢弃。
项目 composer.json 中 presence 即覆盖
Composer 不做“合并”判断,只看项目根目录下 composer.json 是否存在 repositories 键。一旦存在,无论值是空数组、单个私有源,还是完整列表,全局配置即失效。
- 验证方式:运行
composer config repositories,输出必须与你项目composer.json中写的完全一致;如果还看到https://repo.packagist.org或镜像地址,说明配置没生效(常见于路径错误、未 commit、或误改了全局 config) - 即使你只想加一个私有源,也必须把所有需要的源(包括官方源)显式列在项目配置里,不能依赖全局兜底
-
composer config --global repos.packagist.org false这类命令对项目级配置无影响,它只改全局config.json,而项目配置一出现就把它屏蔽了
packagist.org: false 是数组内哨兵,不是全局开关
{"packagist.org": false} 必须作为独立对象出现在 repositories 数组中,且只能放在私有源之后、数组末尾。它不是“关掉 Packagist”,而是告诉 Composer:“查完前面所有源后,别再自动 fallback 到隐式 Packagist”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 放错位置(比如放在私有源前)会导致 Composer 查完私有源立刻碰到它,判定“无源可用”,直接报
Could not find package - 键名必须严格为
"packagist.org",写成"packagist"、"packagist.com"或嵌套在其他仓库定义里都无效 - 禁用后若还需公共包,得手动加回官方源,并确保排在它之后:
{"type": "composer", "url": "https://packagist.org/"}
镜像 URL 和官方 URL 混写会引发不可控网络阻塞
在同一个 repositories 数组里同时写 https://repo.packagist.org/ 和镜像地址(如 https://mirrors.aliyun.com/composer/)是危险操作。
- Composer 按数组顺序线性遍历,遇到第一个声明支持目标包的源才发请求;但
https://repo.packagist.org/是默认兜底源,一旦排在镜像前,它会抢先触发真实 HTTP 请求 - 如果公司网络策略限制访问官方源,或 DNS 解析失败,Composer 会在该请求上卡住数十秒甚至超时,而不是跳过它去试下一个
- 正确做法:只保留镜像 URL,并确保其
packages.json元数据完整(含provider-includes),避免因元数据缺失导致“查到却不用”的假失败
最容易被忽略的是:项目配置覆盖是硬切换,没有中间态。你以为只是“加了个私有源”,实际已把全局镜像、认证凭据、自定义源全部清空。每次初始化新项目或迁入旧项目,第一件事就是确认 composer config repositories 输出,而不是假设“镜像还在”。










