composer如何配置离线源?

4次阅读

离线源需禁用 packagist.org 并配置镜像,satis 需手动补全依赖、生成 packages.json,platform 配置避免扩展检测失败,私有包须用唯一命名空间防 autoload 冲突。

composer如何配置离线源?

composer install 时还在连 packagist.org?说明没配离线源

离线源本质是把 packagist.org 的元数据镜像到本地或内网服务器,让 composer install 不依赖外网。不是简单改个 repositories 就能生效——Composer 默认仍会 fallback 到官方源,除非显式禁用。

  • 必须在 composer.json 中设置 "packagist.org": false(注意 key 是字符串,不是布尔值)
  • 推荐用 composer config --global repo.packagist composer https://your-mirror.com 全局配置,比每次改项目文件更可靠
  • 如果镜像服务用的是私有 Satis 或 private Packagist,确保其 packages.json 已生成且可被 HTTP 访问,否则会报 Could not parse version constraint

用 satis 搭建离线源,最常卡在 packages.json 生成失败

satis build 不是“一键同步”,它只按 satis.json 里写的 require 列表拉包,不会自动抓取依赖树全量包。漏写一个依赖,composer install 就会退回到联网找包。

  • satis.json 中的 "require-all": true 仅对指定仓库生效,不等于“同步所有 packagist 包”
  • 建议先用 composer depends --tree vendor/package-name 手动理清依赖链,再写进 satis.jsonrequire
  • 生成后检查输出目录下是否有 packages.jsoninclude/all$xxx.json,缺任意一个,Composer 都会报 file could not be downloaded

离线模式下 require-dev 依然触发联网?因为没关掉 platform config

即使源已离线,composer install --no-dev 仍可能报错说找不到 ext-redisphp ^8.1 —— 这是 Composer 在校验平台扩展时默认查系统,但某些内网环境 PHP 模块名和版本号无法被自动识别。

  • "platform": {"php": "8.1.0", "ext-redis": "5.3.7"}composer.json,强制跳过运行时检测
  • 避免用 composer install --ignore-platform-reqs,它会掩盖真实缺失的扩展,上线后直接崩
  • 若用 docker,确保 base image 的 PHP 版本和扩展与 platform 声明完全一致,小版本号差一位都可能触发 fallback

私有包 + 离线源混用,autoload 冲突比想象中多

当项目同时 require 私有 git 包和离线镜像里的公共包时,Composer 会优先走 repositories 顺序。如果私有包的 composer.json 里写了 "autoload": {"psr-4": {"App": "src/"}},而离线源里某个包也用了 App 命名空间,composer dump-autoload 就会报重复声明。

  • 私有包务必用唯一命名空间,比如 YourCompanyYourProject,别图省事用 AppCommon
  • 离线源同步前,用 composer show vendor/package --no-ansi | grep autoload 扫一遍目标包是否污染命名空间
  • 运行 composer install -vvv 查看实际加载了哪些 autoload.php,比猜快得多

离线源真正难的不是搭起来,而是让所有参与构建的人——包括 CI 脚本、新同事、甚至你三个月后的自己——都不自觉地绕过官方源。只要有一处没关严,就会在深夜部署时突然连不上 packagist.org

text=ZqhQzanResources