项目级配置会清空私有源,因composer config repo.packagist(无-g)全量替换repositories为单一项,覆盖原有git/satis等私有源;正确做法是手动编辑composer.json,确保repositories为数组且首位设{"packagist.org": false}。

项目级配置为什么反而会清空私有源
执行 composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不加 -g)时,如果项目 composer.json 里已有 "repositories": {} 这种空对象,Composer 会把它当“完整配置”,直接全量替换为单个 packagist 条目——你原有的 Git 私有源、Satis 源、VCS 源全部消失。
常见错误现象:composer install 突然报错找不到私有包,composer show 里也看不到自定义源。
- 检查当前配置:运行
composer config repo.packagist(不加-g),有输出说明项目级已覆盖;无输出才读全局 - 安全写法是手动编辑
composer.json,确保repositories是数组,且首位为{"packagist.org": false},第二位才是镜像源 - 已有私有源时,别用命令行追加——先删掉
"repositories": {},再用命令(它会自动转成数组并追加)
全局配置在 CI/CD 和宝塔里为啥总失效
因为 composer config -g 写的是当前登录用户的 ~/.composer/config.json,而 GitHub Actions 默认用 runner 用户、宝塔计划任务用 www 用户、Docker 构建常以 root 或非交互用户运行——它们的家目录下根本没有这份配置,或者权限不可读。
现象:本地 composer install 很快,CI 流水线却卡在 Resolving dependencies 或报 Could not fetch https://packagist.org/packages.json。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- CI 脚本开头加一句
composer config -g --unset repos.packagist,避免缓存干扰 - 更可靠的做法:把镜像配置写进
composer.json,并用composer config repo.packagist composer https://mirrors.aliyun.com/composer/(无-g)确保它被正确追加为数组项 - 确认路径:Linux/macOS 是
~/.composer/config.json,Windows 是%APPDATA%\Composer\config.json;用composer config --list可查实际加载路径
换镜像后 hash 不匹配,其实是 lock 文件在“假装生效”
composer.lock 里记录的是旧源下的 dist.url 和 dist.shasum。哪怕你已经切了阿里云镜像,composer install 仍会按 lock 文件里的原始 URL 去找包——而镜像站的内部路径和 packagist.org 不一致,导致校验失败。
这不是网络问题,也不是镜像本身不可信,是 lock 文件和当前源不匹配的必然结果。
- 必须删掉
vendor/和composer.lock两个文件(只删 lock 不够,vendor 里残留的旧包会干扰) - 然后只运行
composer install(不是update),让 Composer 从头解析依赖、生成适配新镜像的 lock 文件 - 如果团队协作,确保
composer.lock提交进 Git,且没被 IDE 自动修改时间戳——Composer 会校验内容+修改时间双重一致性
为什么 type 和 url 的拼写细节决定镜像是否静默失效
镜像配置里一个斜杠、一个字段名写错,就会让 Composer 完全忽略你的设置,还不会报错——它会安静 fallback 到 packagist.org,你只会觉得“怎么还是这么慢”。
例如:"url": "https://mirrors.aliyun.com/composer"(缺末尾 /)会导致请求变成 packages.json → https://mirrors.aliyun.com/composers/packages.json,404 后直接回源。
- 正确
type是composer(不是vcs或空字符串) -
url必须以/结尾,且协议为https://(内网可临时用http://,但生产禁用) - 全局配置中,用
repos.packagist(带s)而非repo.packagist,后者是危险的全量替换字段 - 验证是否生效:运行
composer diagnose,输出中必须同时出现secure-http: OK和signature verification: OK
composer.json、以及 composer.lock 的历史快照。任何一层不一致,都会导致行为漂移。尤其在自动化环境中,靠命令行临时写配置远不如 Git 可追踪的声明式配置来得稳定。










