内网Composer卡在Resolving dependencies是因默认连外网源,需改源、配服务、验响应头三步到位:先用composer config -g repo.packagist确认是否仍指向https://repo.packagist.org,再配内网HTTPS或file:///镜像(URL末尾必须带/),最后确保Nginx返回Content-Type: application/json且packages.json可直接访问。

内网 Composer 卡在 Resolving dependencies 不是网络不通,而是它一启动就死磕 https://repo.packagist.org/packages.json,而这个地址在没外网时根本连不上——改源、配服务、验响应头,三步缺一不可。
怎么确认 composer 还在连外网
别凭感觉,直接查全局配置:
- 运行
composer config -g repo.packagist - 如果输出是
{"type": "composer", "url": "https://repo.packagist.org"},说明没改,立刻切走 - 常见错误:只改了项目级
composer config repo.packagist,但 CI/CD 构建机读的是全局配置,项目级的会被忽略 - 正确命令(内网 HTTPS 镜像):
composer config -g repo.packagist composer https://packagist.internal - 如果是本地文件系统镜像(如 Satis 输出目录),必须写成
file:///data/packagist(注意三个斜杠),HTTP 地址默认被拒绝,除非加--allow-http
Satis 静态镜像 404 或 file could not be downloaded 怎么排
这不是网络问题,是服务端响应不合规,Composer 会静默跳过:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Nginx/Apache 必须返回
Content-Type: application/json,否则返回text/plain会被拒绝;Nginx 示例:types { application/json json; } - 镜像 URL 必须以
/结尾,比如https://pkgs.internal/;少一个斜杠,Composer 会拼成https://pkgs.internalpackages.json(404) -
dist/目录下的 ZIP 路径必须可直接 GET,例如https://pkgs.internal/dist/vendor/package/version-hash.zip;SELinux 或文件权限常锁死该路径 - 构建命令漏掉输出目录,比如
php bin/satis build satis.json dist,漏掉dist会导致文件生成到错误位置
repositories 里 type: "vcs" 和 type: "composer" 到底怎么选
本质是权衡“实时性”和“稳定性”:
-
type: "vcs":直接写 Git 地址(如"https://git.internal/project-a"),无需额外服务,但每次composer install都要git clone,CI 构建慢、易因网络抖动失败 -
type: "composer":指向 Satis 生成的packages.json(如"https://satis.internal/packages.json"),只走 HTTP 下载,稳定、可 CDN 缓存,但需手动php bin/satis build更新 - 混用风险:用
type: "composer"却没在repositories末尾加{"packagist.org": false},Composer 仍会 fallback 到公网源,私有包可能被忽略 - 必须禁用默认源,否则即使配置了内部地址,
composer install仍可能卡在Loading composer repositories
为什么 vendor/autoload.php 报 Class not found
配置镜像源只解决「下载」问题,不解决「自动加载」:
- 检查私有包的
composer.json是否包含有效autoload块,例如:"autoload": {"psr-4": {"Acme\Internal\": "src/"} } - 若私有包是 ZIP 归档或无
composer.json,需在项目级composer.json中手动补全:"autoload": {"classmap": ["vendor/acme/internal/lib/"]} - 每次修改
autoload后,必须运行composer dump-autoload,否则变更不生效 - 私有包更新后拉不到最新版,往往不是镜像没同步,而是 autoload 没刷新,或者命名空间声明错位
最易被忽略的是:Satis 不是服务,只是静态文件生成器;你看到的“私服”其实是 Nginx 在跑,而它很可能根本没把请求路由到 packages.json 上——用 curl -I https://your-satis.example.com/packages.json 看状态码和 Content-Type,比猜强十倍。

















