内网composer卡在resolving dependencies是因默认连外网packagist.org失败,须改全局源为内网地址并确认config -g repo.packagist输出正确;satis镜像需确保web服务返回application/json、url以/结尾、dist路径可访问,且require-all与require不可混用。

内网或隔离环境用 Composer,核心不是“能不能装”,而是“它默认会卡死在 Resolving dependencies 阶段”——因为一启动就去连 https://repo.packagist.org/packages.json,而这个请求在没外网时根本发不出去。
怎么确认当前配置还在连公网
别猜,直接查全局源:
- 运行
composer config -g repo.packagist - 如果输出是
{"type": "composer", "url": "https://repo.packagist.org"},说明没改,立刻切走 - 常见错误:只改了项目级
composer config repo.packagist,但 CI/CD 构建机读的是全局配置,项目级的会被忽略
Satis 静态镜像为什么 composer install 报 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),会导致文件生成到错误位置
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 到公网源,私有包可能被忽略
auth.json 权限和位置为什么总出问题
凭据泄露或认证失败,90% 出在这里:
- 必须放在项目根目录(与
composer.json同级)或全局~/.composer/auth.json,不能放错路径 - Linux/macOS 下权限必须是
600(chmod 600 auth.json),否则 Composer 静默忽略,只报Authentication failed - HTTPS Git 地址的凭据写法:key 是域名(如
"gitlab.internal"),不是完整 URL;内容格式为{"http-basic": {"gitlab.internal": {"username": "xxx", "password": "yyy"}} - CI 环境别用
composer config --global写凭据——不同项目可能需要不同账号,应通过COMPOSER_AUTH环境变量注入
最易被忽略的一点:Satis 不代理 dist 下载,所有 ZIP 包仍从原始 Git 地址拉取。这意味着,即使 packages.json 能访问,如果 CI 机器无法直连那个 Git 仓库(比如 Gitea 地址),composer install 依然会失败——这个依赖链要提前理清,不能只盯着 Satis 本身。










