不能用内网穿透共享composer镜像源,必须部署http可访问的静态服务(如satis+php内置服务器或nginx),且composer config -g repo.packagist需指向含/结尾的有效http地址(如http://192.168.1.100:8000/),并确保require-all:true、content-type:application/json及防火墙放行。

不能用“内网穿透”共享 Composer 镜像源——Composer 本身不支持穿透逻辑,所谓“本地测试镜像”必须是 HTTP 可访问的静态服务,不是靠端口转发或 ngrok 暴露本地路径就能用。
composer config -g repo.packagist 必须指向真实 HTTP 服务
很多人把本地 satis 构建好的 web/ 目录直接用 php -S 起个临时服务器,再配 composer config -g repo.packagist composer http://localhost:8000/,结果其他机器连不上。原因很直接:
-
localhost对其他机器不可达,必须用局域网 IP(如http://192.168.1.100:8000/)且确保防火墙放行该端口 -
php -S默认只监听127.0.0.1,启动时得显式写php -S 192.168.1.100:8000 router.php - 响应头必须含
Content-Type: application/json,否则 Composer 解析packages.json失败,静默 fallback - URL 末尾必须带
/,否则内部拼接成http://192.168.1.100:8000packages.json→ 404
file:// 协议在 Composer 2+ 中已被禁用
别再试 "type": "path" 或 file:///path/to/mirror —— 这类配置只在当前机器当前用户下有限生效,且完全不支持语义化版本解析、不生成 provider 文件、CI 和 Docker 环境里基本失效。
- 错误现象:
Could not find package monolog/monolog,即使packages.json就在本地目录里 - 根本原因:Composer 客户端根本不尝试读取本地文件系统,它只发 HTTP 请求
- 替代方案:用 Nginx/Apache 托管镜像目录,哪怕只是本机跑,也必须走
http://
验证是否真走本地镜像,别信“配了就完事”
改完配置后,composer install 仍连外网?先确认三件事:
- 运行
composer config -g repo.packagist,输出必须是完整 JSON 对象,形如{"type": "composer", "url": "http://192.168.1.100:8000/"};空、null或报错说明没写对 - 用
composer install -vvv看第一行日志,应出现Downloading https://192.168.1.100:8000/packages.json,而不是packagist.org - 在镜像服务端开 access log,确认有来自其他机器的
GET /packages.json请求,没有就说明客户端根本没发过去
最常被忽略的一点:Satis 构建时没加 "require-all": true,导致只同步了 composer.json 里明写的包,其他依赖链上的包(比如 psr/log)压根没进索引,客户端查不到就静默失败,你以为是网络问题,其实是镜像数据不全。











