换镜像后仍连packagist.org,因composer config -g仅改元数据源,不控制zip下载路径;必须项目级硬编码带时间戳的只读镜像url,确保packages.json与zip路径严格一致,并由nginx校验sha256。

中文镜像不能消除外部网络依赖,只能降低其不可靠性;真正切断依赖必须靠项目级硬编码只读镜像 URL + Nginx 校验 + 离线缓存策略。
为什么换镜像后 still 会连 packagist.org?
因为 composer config -g repo.packagist 只改元数据源(packages.json),不控制 ZIP 包实际下载路径。Composer 仍从 dist.url 字段拉取 ZIP,而公共镜像(如阿里云)不保留 dist.shasum,导致校验静默跳过——你根本不知道包是否被篡改。
- 现象:
composer install成功但加载了未签名包,composer validate不报错 - 根源:Composer v2 默认启用
secure-http,但若dist.shasum为空或不匹配,它会降级为无校验模式 - 解决:必须在项目级
composer.json中硬编码带时间戳的只读镜像 URL,例如:"repositories": { "packagist": { "type": "composer", "url": "https://edge-mirror.local/2026-06-15/" } } - 该 URL 下必须同时存在
packages.json和所有对应 ZIP 包,路径严格为/dists/vendor/package/version/hash.zip
如何让 Composer 在边缘节点完全离线运行?
光换镜像不够,得切断所有隐式网络调用:
-
cache-dir必须指向 RAMFS 或 tmpfs,例如"cache-dir":"/dev/shm/composer",避免 SD 卡频繁写入损坏设备 - 禁用
fxp/composer-asset-plugin—— 它绕过镜像机制,直连 GitHub API,在网络中断时直接卡死 - 运行
composer dump-autoload --optimize --classmap-authoritative,生成全量类映射表,关闭 PSR-4 动态查找 - 部署前务必执行
composer check-platform-reqs,检查 PHP 版本、扩展(如openssl、mbstring)是否满足,否则部署即崩
CI/CD 中镜像配置为何总失效?
全局配置 composer config -g 在 CI 环境中基本不可靠:
- GitHub Actions、GitLab CI 使用 runner 用户,但
-g写的是当前 shell 用户的~/.composer/config.json,权限不一致就失效 - 宝塔面板以
www用户运行,同样读不到 root 配的全局配置 - 正确做法:进项目根目录,运行
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不带-g),它会安全合并到composer.json的repositories字段 - 改完删掉
vendor/和composer.lock,再跑composer install,否则旧 lock 文件里的 hash 可能和镜像元数据不匹配
真正可靠的离线部署,不是“配个镜像就完事”,而是把镜像 URL 当作不可变快照来用——带日期路径、Nginx 校验 SHA256、类映射固化、平台检查前置。这些点漏掉任意一个,边缘节点就可能在半夜 3 点 silently fail。











