根本原因是composer必须先下载packages.json元数据才能解析依赖,若packagist.org不可达且未显式禁用,默认卡在loading composer repositories阶段;需正确配置repo.packagist镜像并验证生效。

为什么 composer install 会卡在 packages.json 而不是 ZIP 下载
根本原因是 Composer 在解析依赖前,必须先请求 packages.json 元数据文件——它不关心你有没有 vendor 备份,也不管 dist 包是否已存在。一旦默认源 packagist.org 不可达,且你没显式禁用它,命令就会卡在 Loading composer repositories 阶段,甚至不报错。
常见错误现象:Resolving dependencies 长时间无响应、Could not fetch https://repo.packagist.org/packages.json、或日志里反复出现 404 Not Found(路径拼错为 /packages.json 被截成 packages.json)。
-
packagist.org必须显式设为false,不能靠删掉默认源或只加私有地址来“替代” - 私有源 URL 必须以
/结尾,否则 Composer 拼接路径时丢掉斜杠,变成https://pkgs.internalcompany.compackages.json - 全局配置
repo.packagist和项目级repositories共存时,前者优先;但若项目里写了"packagist.org": false,它会直接屏蔽全局镜像
如何让 Satis 生成的静态镜像真正被 Composer 识别
Satis 不是服务,是构建器。它输出的 packages.json 必须满足三个硬性结构条件,否则 Composer 客户端直接拒绝加载:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"name"和"homepage"字段缺一不可——Satis 构建失败或生成空索引,往往就因为这两个字段漏填 -
"require-all": true必须开启,否则只同步composer.json中显式 require 的包,dev 分支、tag、间接依赖全被忽略 -
"archive"块要完整:包括"directory"、"format": "zip"、"skip-dev": false(若需拉dev-main) - Nginx/Apache 必须能正确返回
packages.json的Content-Type: application/json,否则 Composer 解析失败静默跳过
auth.json 放哪才生效,以及为什么总提示 Authentication required
Composer 查找凭据的顺序是严格固定的:当前项目目录 → $COMPOSER_HOME/auth.json(通常是 ~/.composer/auth.json)→ 已弃用的 $HOME/.composer/auth.json。放错位置等于没配。
- Git 私有仓库认证(如 GitLab)必须用
http-basic或github-oauth格式写进auth.json,不能只靠 SSH key —— Satis 构建时不会读取用户 SSH 环境 - Packeton 或 Private Packagist 类服务要用
Bearertoken,格式为:{"bearer": {"your-packeton.example.com": "abc123..."}} - Windows 用户改完
auth.json后必须重启终端,否则 PHP 进程仍读旧缓存 - CI 环境常用
www-data或runner用户执行,-g配置写的是当前登录用户,得用sudo -u runner composer config -g ...显式指定
内网环境切换源后仍连外网?排查三步法
别信“我配过了”,90% 的问题出在验证环节没做对。直接运行以下命令:
-
composer config -g repo.packagist—— 输出必须是完整 JSON:{"type":"composer","url":"https://pkgs.internal/"};若为空、报错或只有 URL,说明没写对 -
composer diagnose—— 关注secure-http: OK和signature verification: OK;若后者为disabled,说明镜像跳过了签名校验,有风险 -
composer clear-cache && rm -rf vendor composer.lock && composer install -vvv—— 观察日志中所有 HTTP 请求域名,确认没有packagist.org出现
最易被忽略的一点:Satis 构建后,packages.json 缓存可能残留旧版本,必须手动触发 php bin/satis build satis.json web/ --no-interaction 强制刷新,否则新包永远不进索引。










