全局配置composer config -g在ci/cd和docker中基本不生效,因其写入当前用户家目录的~/.composer/config.json,而ci runner、docker容器或宝塔www用户均不读该路径;项目级配置更可靠,需用composer config repo.packagist composer https://mirrors.aliyun.com/composer/写入composer.json并删除vendor/和composer.lock后重装。

为什么全局 config -g 在 CI/CD 和 Docker 里基本不生效
因为 composer config -g 写的是当前用户的 ~/.composer/config.json,而 CI/Agent(如 GitHub Actions runner)、Docker 容器、宝塔后台服务用户(如 www-data)根本不会读这个路径——要么目录不存在,要么权限不对,要么压根不是那个用户在执行命令。
更隐蔽的问题是:即使你用 sudo composer config -g 写进了 /root/.composer/config.json,实际运行 PHP 的是普通用户,配置依旧被忽略。命令不报错,但 composer config -g repo.packagist 输出为空,你根本察觉不到失败。
- GitHub Actions 默认使用
php-actions/composer动作,它只认项目根目录下的composer.json,完全跳过全局配置 - Docker 构建时,基础镜像(如
php:8.2-cli)通常没初始化~/.composer,composer config -g静默失败 - 宝塔“一键部署”以
www用户运行,读的是/home/www/.composer/config.json,不是你的/root/.composer
项目级配置怎么写才安全不破坏私有源
直接改 composer.json 的 repositories 字段是最可靠的方式,但不能手动硬编码——容易格式错、漏键、覆盖已有私有源。
正确做法是在项目根目录下运行:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/
这条命令会自动向 repositories 数组追加条目,前提是它已经是数组结构。如果当前是空对象 "repositories": {},它会整个覆盖;如果是空数组 "repositories": [],命令会失败,需先手动改成 "repositories": [ ](注意空格)再重试。
- 必须确保
"packagist.org": false出现在composer.json顶层(不是repositories里),否则仍可能 fallback 到官方源 - 国内镜像应放在
repositories数组第一项,fallback 官方源放第二项,避免新包未同步时安装失败 - 改完后不要只跑
composer update,旧composer.lock里的dist.url还是https://api.github.com/,必须删掉vendor/和composer.lock,再执行composer install
/etc/composer/config.json 是集群唯一真正全局的配置路径
Composer 2.2+ 引入了系统级配置支持,/etc/composer/config.json 优先级高于所有用户级配置,且不依赖 $HOME 或 COMPOSER_HOME,适合服务器集群统一分发。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
但必须严格满足几个条件,否则会被忽略:
- 目录
/etc/composer/必须存在,权限为755;文件/etc/composer/config.json权限为644 -
repositories必须是对象(不是数组),且包含"packagist.org": false键 - 镜像 URL 必须以
/结尾,例如"https://mirrors.aliyun.com/composer/" - 必须用实际运行用户(如
www-data)验证:切换到该用户后执行composer config repo.packagist,输出应为镜像地址
CI 流水线里怎么自动验证并 fallback 镜像
不能假设镜像永远可用。跨国团队或临时网络波动时,阿里云/腾讯云镜像可能短暂不可达,CI 直接失败。
推荐在 Pipeline 中加入探活逻辑:
curl -I -s -o /dev/null -w "%{http_code}" https://mirrors.aliyun.com/composer/packages.json
若返回非 200,则 fallback 到官方源,并确保 "packagist.org": true 或删除该字段。再执行:
composer config repo.packagist composer $MIRROR_URL/
注意:$MIRROR_URL 变量末尾必须带 /,否则 Composer 会拒绝写入。
- 切镜像后不要保留旧
composer.lock,dist URL 不走镜像,这是最常被忽略的点 - CI 中禁用
sudo composer,所有命令以构建用户身份运行,显式声明缓存路径(如$COMPOSER_HOME/cache/) - 企业内网若拦截 HTTPS,可临时用
http://地址调试,但生产环境必须恢复 HTTPS










