composer全局配置composer config -g repo.packagist在局域网不生效,因其仅写入当前用户(如root)的~/.composer/config.json,而宝塔、docker或ci常以www/runner等非root用户运行,导致配置不可见;同时键名错为repos.packagist、漏type: "composer"、url缺末尾斜杠任一错误均静默回退官方源,验证需输出完整json对象如{"type": "composer", "url": "https://your-mirror.internal/"}。

composer config -g repo.packagist 在局域网里为什么总不生效
因为这条命令只写进当前用户的 ~/.composer/config.json,而宝塔、Docker 或 CI 流水线常以 www、runner、www-data 等非 root 用户运行,根本读不到 root 下的配置。更隐蔽的是:键名错写成 repos.packagist(多一个 s)、漏掉 type: "composer"、URL 少末尾斜杠 /——三者任一出错,Composer 都静默 fallback 到 https://packagist.org,且不报错。
验证是否真生效,必须运行:composer config -g repo.packagist
输出必须是完整 JSON 对象,形如:{"type": "composer", "url": "https://your-mirror.internal/"}
空、null、Key not found,或只返回字符串(如 "https://packagist.org"),都说明没写进去。
项目级 composer.json 怎么写才真正走局域网镜像
项目级配置优先级高于全局,且能随代码交付,是私有化部署唯一靠谱的方式。但手写极易漏关键项,导致 Composer 仍 fallback 到外网。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用命令追加,不是覆盖:
composer config repo.packagist composer https://your-mirror.internal/(注意不带-g) -
"packagist.org": false必须写在composer.json根节点(和require同级),不是嵌套在某个repositories项内部 - 私有镜像 URL 必须以
/结尾,否则 Composer 会拼成https://your-mirror.internalpackages.json,404 - 如果原
"repositories": []是数组,命令会失败;需先手动改成"repositories": {}再执行 - 改完立刻删掉
vendor/和composer.lock,否则旧 lock 文件里的哈希仍指向原始源,校验失败
Satis 构建后 composer install 还 404 的真实原因
Satis 不是 Web 服务,只是静态文件生成器。它不监听端口、不启动进程,只把 packages.json 和 ZIP 包写进 output-dir。404 不是网络不通,是 Web 服务器没正确暴露这些文件。
- Nginx 的
root必须精确指向satis.json中output-dir的子目录(通常是web),例如:root /var/www/satis/web; - 必须显式声明 JSON MIME 类型:
types { application/json json; },否则返回text/plain,Composer 拒收 - 检查
dist/下 ZIP 路径是否可直连 GET,例如:https://pkgs.internal/dist/monolog/monolog/2.10.0/xxx.zip
SELinux 或文件权限常锁死该路径 - 没把
packages.json设为默认索引文件,访问根路径https://pkgs.internal/时服务器去找index.html,但 Satis 默认不生成这个文件
为什么换源后 ZIP 包还是从 GitHub 下载
composer config -g repo.packagist 只替换元数据入口(packages.json),不修改包的 dist.url 字段。ZIP 文件仍从原始源(如 https://github.com/monolog/monolog/releases/download/...)下载,局域网打不开。
验证方式很简单:composer show monolog/monolog --verbose
看输出里的 dist.url 字段是不是还指向 GitHub。如果是,说明镜像没真正接管下载链路。
私有镜像要真正可用,必须让每个包的 dist.url 指向你自己的 HTTP 服务,例如:https://pkgs.internal/dist/monolog/monolog/2.10.0/xxx.zip
这需要 Satis 构建时启用 archive 模式,并确保 Web 服务能正确响应 ZIP 请求——这点最容易被忽略,也是调试最耗时的一环。










