必须手动编辑composer.json的repositories数组,首位加{"packagist.org": false}禁用默认源,再按私有源→镜像源顺序追加条目,避免命令覆盖导致私有源丢失。

局部镜像配置不是“比全局少个 -g”就完事,它本质是修改项目级 composer.json 的 repositories 字段,而这个字段一旦存在,就会彻底屏蔽全局镜像——不是降级,是直接跳过。
为什么 composer config repo.packagist 在项目里执行会清空私有源
这条命令默认把整个 repositories 字段替换成一个对象:{"packagist": {"type": "composer", "url": "..."} }。如果你原本有 Git 私有包、企业 Nexus 源或自建 Satis 仓库,它们全会被抹掉。
- 执行前先检查:运行
composer config repo.packagist(不带-g),如果输出非空,说明已有配置 - 更安全的做法是手动编辑
composer.json,确保repositories是数组([]),然后在首位插入镜像条目 - 必须显式禁用官方源:在数组开头加
{"packagist.org": false},再加镜像源,否则 Composer 可能仍尝试回退 - 示例结构应为:
[{"packagist.org": false}, {"packagist": {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}}]
repositories 字段写成空对象 {} 就会失效
很多人从脚手架拉的项目,composer.json 里已有 "repositories": {}。这看似无害,实则触发了 Composer 的“禁用默认源”逻辑——它会跳过所有默认行为,包括读取全局 repo.packagist 配置。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
composer config repo.packagist返回Key does not exist,不代表没配置;只要repositories存在(哪怕为空对象),全局镜像就完全不生效 - 验证方式:删掉
repositories字段后运行composer install -vvv,看日志是否出现GET https://mirrors.aliyun.com/composer/ - CI/CD 流水线中常见:GitHub Actions 的
actions/checkout会完整拉取composer.json,空repositories会导致所有 runner 都走官方源
局部配置下如何保留私有 Git 仓库和 Packagist 镜像共存
不能靠命令自动合并,必须人工控制顺序和结构。Composer 按 repositories 数组顺序查找包,遇到第一个匹配就停,所以镜像源要放最后,私有源放前面。
- 正确顺序:
私有 Git 源 → packagist.org: false → 镜像源;这样既能装内部包,又能装公共包,且公共包走镜像 - Git 源示例:
{"type": "vcs", "url": "https://gitlab.example.com/my/private-package.git"} - 镜像源必须用
"packagist"作为 key(不是"packagist.org"),否则 Composer 不识别为替代源 - 不要用
composer config repo.packagist composer ...覆盖,改用composer config repositories[] --json '{...}'追加条目
局部配置真正麻烦的点不在写法,而在协作一致性:有人本地配了全局,有人提交了 repositories: [],CI 环境又没清理缓存——最终表现就是同一份代码,在不同机器上走不同源,composer.lock 哈希还不一致。最稳的方式,是团队约定只用项目级配置,并在 .gitignore 里排除 vendor/ 和 composer.lock(若使用 lock 文件,则必须提交并统一生成环境)。










