Composer的repositories配置本质是包路由规则系统:顺序决定优先级,type决定行为,显式禁用packagist.org({"packagist.org": false})才是控制起点;私有源须为type: "composer"且packages.json含目标包,vcs仅限require明确指定时触发,混用类型行为割裂,数组写法错误会导致静默忽略。

Composer 的 repositories 不是“加几个 URL 就能多源并用”,它本质是一套包路由规则系统——顺序决定优先级,type 决定行为,禁用默认源才是控制权的起点。
怎么让私有包一定从内部源走,而不是被 packagist.org 覆盖
根本问题不在“有没有配私有源”,而在于 Composer 默认会把 packagist.org 当作隐式兜底源。哪怕你写了十个私有仓库,只要没显式关掉它,同名包就可能被官方旧版覆盖或跳过认证直接失败。
-
"packagist.org": false必须作为repositories数组里的一个独立对象,不能塞进其他仓库配置里 - 私有源类型必须是
"type": "composer"(如 Satis、Private Packagist),且其packages.json真正包含目标包条目;只配vcs类型不会参与全局包发现 - 如果还想保留部分公开包能力,得手动把
https://packagist.org显式加回数组末尾,且 type 仍为composer - CI 环境建议彻底禁用并显式添加可信镜像(如阿里云),避免因本地未禁用导致构建结果不一致
为什么改了 repositories 顺序,composer install 还是不拉新源
因为 composer.lock 锁死了具体版本 + dist URL + 源地址三元组。哪怕你把私有源调到第一位、packagist.org 设为 false,只要 lock 文件里记录的是旧 commit 或旧 dist 地址,install 就不会重新解析源。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 想安全更新源信息:运行
composer update --lock,它只重写 lock 文件中的源字段,不改动已安装包 - 想彻底重来:删掉
composer.lock再跑composer install(仅限开发环境) - 临时验证是否命中正确源:加
-vvv参数跑composer require,看日志里实际请求的 URL 是哪个
混用 vcs 和 composer 类型源时,哪些包会走哪条路
行为完全割裂:composer 类型源管“所有包的元数据发现”,vcs 类型源只在 require 中明确写了对应包名时才触发克隆和解析——它不索引、不广播、不兜底。
- 若你配了
{"type": "vcs", "url": "https://gitlab.company.com/acme/logger.git"},但没在require里写"acme/logger": "dev-main",这个源就等于不存在 - 若同时存在
vcs和package类型声明同一包名,package类型胜出——这是唯一能强制路由的方式 - 多个
vcs源共存时,Composer 不会合并它们的包列表,只对明确 require 的那个仓库发起 Git 操作 - Git 认证必须走
auth.json,且域名要精确匹配(如gitlab.company.com),HTTPS URL 要带 token 并 URL 编码,SSH 方式在 CI 中通常不可靠
本地开发多包联动,为什么 path 类型源改了代码却不生效
path 类型源不是实时监听器,它只在 composer install 或 update 阶段建立软链或拷贝,后续代码变更不会自动同步 autoload 映射。
-
url必须是相对路径,指向含有效composer.json的目录,不是文件 -
require中版本必须写"*@dev"或"dev-main",否则 Composer 仍去远程找包 - 改了被依赖包的
autoload配置或类结构后,必须手动运行composer dump-autoload - 加
"options": {"symlink": true}可启用符号链接,避免重复拷贝,但生产环境严禁提交
最常被忽略的一点:所有 repositories 配置都必须是 JSON 数组,写成对象(比如 {"my-repo": {...}})会导致 Composer 静默跳过部分项——这不是兼容性问题,是解析逻辑本身不支持。检查方式很简单:composer config repositories 输出为空或不全,八成是这里错了。

















