不能靠repositories+path或file://实现局域网共享,因其仅限本机文件系统、不启HTTP服务、不生成packages.json元数据;可行方案是Satis静态镜像(轻量纯静态)或代理型镜像(秒级同步但部署重)。

局域网内共享 Composer 包,不能靠 repositories + path 或 file:// 协议实现跨机器访问——它只在本机文件系统生效,其他机器根本解析不了路径,也拿不到语义化版本信息。
为什么 repositories + path 在局域网里完全失效
很多人把包放一台机器上,然后在 composer.json 里写 {"type":"path","url":"./packages/*"},以为别人 composer install 就能自动拉。实际根本不行:
-
path类型不启动任何服务,其他机器无法通过 HTTP 访问,file://协议在 Docker、CI 或不同用户权限下基本不可用 - 不生成
packages.json元数据,composer require monolog/monolog直接报Could not find package - 删掉本地目录,整个依赖树就崩,没有容错和复用能力
- Composer 客户端不会尝试解析远程路径,它只认本地相对或绝对路径
真正可行的方案只有两种:Satis 静态镜像 或 代理型镜像
选哪个取决于团队是否需要随时同步 Packagist 上的新包:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 中小团队、私有包为主、内网隔离严 → 用
Satis:轻量、纯静态、Nginx/Apache 直接托管即可 - 要秒级同步官方源(比如 Laravel、Symfony 这类带 GitHub ZIP 的大包)→ 上代理镜像(如
packagist-mirror),但部署成本高,需 OSS + Redis + Nginx - 别用
require-all: true轻易全量同步,首构建可能超 40GB,内存溢出或超时;更糟的是会暴露dev-分支,导致composer update拉到不稳定代码
composer.json 和全局配置怎么写才真正生效
镜像搭好了,但客户端不认,90% 是因为配置没对路:
- 项目级
composer.json必须显式声明内网源:"repositories": [{"type": "composer", "url": "https://pkgs.internal/"}],且url末尾必须带斜杠 - 务必加
"packagist.org": false,且放在repositories数组顶层,不是嵌套在某个仓库对象里 - 内网源必须排在
repositories数组第一位,Composer 按顺序查找,不会合并同名包 - 全局配置用
composer config -g repo.packagist composer https://pkgs.internal/,键名是repo.packagist(不是repos.packagist),type字段不能丢 - CI 构建机常以非 root 用户运行,
-g写的是 root 配置,得换用户执行,或改用环境变量:COMPOSER_REPO_PACKAGIST=https://pkgs.internal
Satis 镜像跑起来却 404?常见 Web 层坑点
Satis 不是服务进程,它只生成静态文件;404 不是网络不通,而是 Web 服务没暴露对路:
- Nginx 的
root必须精确指向satis.json中output-dir的路径,例如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 或文件权限常锁死该路径 -
dist.url字段必须指向内网可访问地址,不能留 GitHub 原始链接;验证方式:composer show monolog/monolog --verbose看输出
最易被忽略的是:Satis 构建后,packages.json 里的所有 dist.url 都必须是内网 HTTP 可 GET 的地址——哪怕元数据对了,ZIP 下不来,composer install 依然静默失败,且不提示具体哪一环出错。

















