composer不支持zeroconf自动发现镜像源,所有源地址必须显式配置;其http客户端不解析.local域名、不查询mdns/srv记录,仅依赖标准dns或hosts文件解析。

局域网里根本不存在 Composer 镜像源的 ZeroConf(如 mDNS / Bonjour)服务发现机制——Composer 客户端不支持自动发现镜像源,所有源地址必须显式配置,否则它只会 fallback 到 packagist.org 或报错。
Composer 从不解析 .local 域名或尝试 mDNS 查询
很多人在内网部署了 Satis 或 packagist-mirror 后,试图用 https://packagist.local 或 https://mirror._composer._tcp.local 让客户端自动连上,结果失败。原因很直接:
- Composer 的 HTTP 客户端(基于 Guzzle 或 PHP stream)不做任何 DNS 扩展查询,
packagist.local能否解析完全依赖系统/etc/hosts或本地 DNS 服务器,和 ZeroConf 无关 -
composer config所接受的url字段只认标准 URL 格式,不识别服务类型(如_http._tcp)、不读取 SRV 记录、不拼接端口或路径 - 即使你用
avahi-daemon或dnsmasq把packagist.internal解析到内网 IP,那也只是普通 DNS 解析,不是 ZeroConf “发现”
为什么有人误以为 ZeroConf 可行
常见混淆点来自两类场景:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 某些 IDE(如 VS Code Remote-SSH)或容器平台(如 Docker Desktop)自带 mDNS 支持,让开发者在浏览器里能打开
http://mirror.local——但这只是浏览器行为,composer install进程完全不共享该能力 - 团队内部文档写了“访问
https://packagist.local”,新人照着 curl 测试成功,就以为 Composer 也能自动连——实际是他们本地/etc/hosts已手动加了映射,或公司 DNS 统一做了 A 记录
真正能让多台机器“零配置”用上内网镜像的方法
不用 ZeroConf,但更可靠、可落地:
- 在所有开发机的
/etc/hosts(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows)里统一加一行:192.168.10.5 packagist.internal——IP 和域名由运维统一分配,一次下发,永久生效 - 用 DHCP Option 119(Domain Search List)或组策略推送 DNS 后缀,让
packagist自动补全为packagist.internal,再配合内网 DNS A 记录 - 项目级配置写死 URL:
composer config repo.packagist composer https://packagist.internal/,这样即使 hosts 没配,只要 DNS 可解析,就能跑通;且该命令会写入composer.json,随 Git 提交,新人git clone && composer install即可用
最容易被忽略的验证环节
改完配置别只信 composer config -g repo.packagist 输出,要亲眼确认请求发到了哪:
- 临时启动一个监听端口:
python3 -m http.server 8080,然后把镜像源设成http://localhost:8080,运行composer update -vvv,看终端是否打出GET /packages.json日志 - 检查
composer diagnose输出里Repo packagist.org:后面是不是你设的内网地址——如果不是,说明配置没生效,或被项目repositories数组覆盖了 - 如果用了 HTTPS 镜像但证书是自签的,
composer默认拒绝连接,需额外加"options": {"ssl": {"verify_peer": false}}到repositories对象里(仅限测试环境)










