企业内网用 Composer 必须配置合规的镜像服务:执行 composer config repo.packagist composer https://mirror.internal/(末尾带斜杠),确保镜像返回标准 packages.json 和 p2/{vendor}/{package}.json,禁用 secure-http 若用自签名证书,并优先采用 Satis 或 composer-proxy 等专用方案。

企业内网用 Composer,核心就一条:不能指望它自己“连上外网再缓存”,必须明确告诉它“所有请求发给谁”,且这个“谁”得是完整实现 Composer 协议的服务——不是反向代理,不是 file:// 路径,更不是随便一个 HTTP 地址。
composer config -g repo.packagist 命令必须写对三要素
这条命令不是“试试看”,写错任意一处都会静默失效,现象是 composer install 依然卡在 Loading composer repositories,还查不到原因:
-
repo.packagist是固定键名,不能写成repos.packagist或repositories.packagist;运行composer config -g repo.packagist应输出完整 JSON 对象,否则没生效 - 第三个参数必须是
composer(字符串),表示类型,不是可选,不是注释,漏掉就 fallback 回官方源 - URL 必须以
https://开头,且末尾带斜杠,比如https://mirror.internal/;写成https://mirror.internal会导致内部拼接成https://mirror.internalpackages.json,直接 404
内网镜像地址必须返回标准 packages.json 结构
你填的 https://mirror.internal/ 不是“能访问就行”,它必须能响应以下两个关键路径:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
GET /packages.json:返回含完整 provider 列表的 JSON,结构和 packagist.org 一致 -
GET /p2/{vendor}/{package}.json(Composer 2.5+):提供语义化版本元数据,缺这个会报 404 或降级失败 - 如果镜像用自签名证书,得额外执行
composer config -g secure-http false,否则 cURL error 60 卡死 - 别用 Nginx 简单反代
https://packagist.org——它不支持跨域直连,CDN 和动态路由无法被反代,结果是空响应或 404
项目级配置比全局更可控,尤其团队协作时
全局配置(-g)看着省事,但实际容易引发一致性问题:
- 项目
composer.json里若已有"repositories"字段(哪怕只配了一个私有包),全局repo.packagist会被完全忽略 - CI 流水线里不同环境可能混用镜像,导致
composer.lockhash 不一致、部署失败 - 推荐进项目根目录执行:
composer config repo.packagist composer https://mirror.internal/(去掉-g),它会安全合并到composer.json的repositories对象里,key 固定为"packagist" - 这样配置可 Git 跟踪,新人拉代码即生效,无需额外文档说明
别把 http-proxy 当镜像,两者逻辑完全不同
很多人以为配了 http-proxy 就等于“用了内网代理”,其实这是两套机制,不能混用:
-
http-proxy和https-proxy只控制底层 cURL 出口,不改写请求地址;它们不会把对https://packagist.org的请求转给内网镜像 - 要走代理,必须同时设两个字段:
composer config -g http-proxy http://10.1.1.100:8080和composer config -g https-proxy http://10.1.1.100:8080(注意协议仍是http://) - 密码含
@或/必须先 URL 编码,用php -r "echo rawurlencode('pa@ss/word');"生成 - 如果公司用 NTLM 代理(常见于 Windows 域环境),Composer 原生不支持,必须加一层本地中转,比如
cntlm监听127.0.0.1:3128,再让 Composer 连它
真正可靠的内网方案只有两种:一是搭 Satis 静态镜像(适合中小团队、低频更新),二是上代理型服务如 composer-proxy(支持透传 signature、自动缓存、兼容 v2 协议)。任何试图用 path 类型仓库或 file:// 协议跨机器共享的做法,都会在 composer require 时直接报 Could not find package。

















