必须用Satis构建静态镜像并配置require-all:true、完整archive块和对象型repositories;全局镜像需设composer config -g repo.packagist且含type与末尾斜杠,同时更新composer.lock以修正dist.url。

不能通过共享文件夹、rsync 或 path 协议实现局域网 Composer 镜像同步——你真正需要的是一个对外提供 packages.json 和 p2/ 元数据的 HTTP 服务,而不是一堆 ZIP 文件的拷贝。
为什么 repositories + path 在局域网里完全无效
很多人在 composer.json 里写 {"type": "path", "url": "./packages/*"},以为把 ZIP 放进共享目录就能用。实际它只在当前机器本地文件系统生效:
- 该配置不启动任何 HTTP 服务,其他机器无法通过
http://访问;file://协议在 Docker、CI 构建机、不同用户权限下基本不可用 - 不生成
packages.json元数据,composer require monolog/monolog会直接报Could not find package - 删掉本地目录,整个依赖树就崩,毫无容错和复用能力
必须用 Satis 构建静态镜像,且三个字段缺一不可
Satis 是唯一轻量、稳定、真正可用的局域网方案。它生成纯静态文件(packages.json + dist/*.zip),扔到 Nginx 就能被所有机器访问。但以下三处配置漏掉任意一个,composer install 就会拉不到 ZIP 包或找不到版本:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"require-all": true——否则只同步composer.json里显式require的包,私有仓库里的其他 tag、dev 分支、历史版本全丢 -
"archive"块必须完整:{"directory": "dist", "format": "zip", "skip-dev": true}——缺这个,CI 构建时只能走git clone,而内网往往禁用 git 协议 -
"repositories"必须是对象数组,每个私有包要单独声明类型:{"type": "vcs", "url": "https://gitlab.internal/internal-sdk"}——写成字符串 URL 或漏掉type,Satis 构建时直接跳过该仓库
全局镜像必须设为 repo.packagist 且含 type 和 https 结尾斜杠
项目级 repositories 在 Composer 2.2+ 后已无法覆盖 Packagist 元数据源,必须靠全局配置:
- 运行
composer config -g repo.packagist composer https://packagist.internal/(注意末尾/) - 键名必须是
repo.packagist(不是repos.packagist或packagist.org),type字段不能丢,否则静默 fallback 回官方源 - URL 必须带
https://和末尾斜杠;http://在新版 Composer 默认被拒绝,除非加--allow-http - 输出为空或报错?常见原因是 PHP 禁用了
proc_open或putenv,需检查php.ini并重启 PHP 服务
composer.lock 里的 dist.url 容易被忽略
即使 Satis 镜像和全局配置全部正确,composer.lock 中已锁定的包仍可能保留旧的 dist.url(比如 https://packagist.org/)。下次 install 时 Composer 会直接下载该 URL,绕过所有镜像设置:
- 解决办法只有重新生成 lock 文件:
composer update --lock或删掉composer.lock后再composer install - 若项目含私有 VCS 包,还需确保
satis.json中对应仓库的url可被所有开发机解析(如用内网域名而非localhost) - 验证是否真走镜像:加
--no-cache -v运行composer install,看终端输出的真实请求 URL 是否命中你配的https://packagist.internal/

















