composer离线运行需让其“以为能联网”,核心是用satis构建http静态镜像(因≥2.2版禁用file://协议);先联网生成含packages.json和zip的web目录,再部署http服务,最后在离线机禁用默认源并配置本地http仓库地址。

离线环境里 Composer 能正常运行,前提是它“以为自己能联网”——不是靠代理转发请求,而是把 packages.json、ZIP 包、哈希校验文件这些元数据和资源提前摆好,并让 Composer 主动去本地路径读取。
为什么直接改 repo.packagist 为 file:// 路径会失败
Composer ≥2.2 默认禁用 file:// 协议作为仓库源(出于安全限制),即使你写成 "repo.packagist": {"type": "composer", "url": "file:///path/to/mirror"},执行 composer install 时也会报错:Invalid repository type "composer" for file:// URL。这不是配置写错了,是 Composer 主动拦住了。
可行解法只有两个:
- 用 Satis 或 Private Packagist 构建符合 Composer 协议的 HTTP 服务镜像(推荐)
- 降级到 Composer 2.1.x(不推荐,有安全风险且不兼容新包格式)
用 Satis 构建可离线使用的静态镜像
Satis 本质是把远程包拉下来,生成一套静态文件结构,再用任意 HTTP 服务托管。它输出的目录天然适配 Composer 的协议要求,离线机只需把它当普通 HTTP 源用即可。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
操作要点:
- 在联网机器上安装 Satis:
composer create-project composer/satis:dev-main satis-build - 编写
satis.json,明确指定要同步哪些包(避免全量拉取):{ "name": "Offline Mirror", "homepage": "http://localhost/mirror", "repositories": [ { "type": "composer", "url": "https://repo.packagist.org" } ], "require-dependencies": true, "require": { "monolog/monolog": "^2.0", "phpunit/phpunit": "^9.0" } } - 生成镜像:
php bin/satis build satis.json web/→ 输出web/packages.json和web/dist/下的 ZIP 包 - 把整个
web/目录拷到离线机,用 Python、PHP 内置服务器或 Nginx 托管,例如:python3 -m http.server 8000 --directory web/
离线机配置:关闭默认源 + 指向本地 HTTP 镜像
关键动作不是“加一个源”,而是“删掉默认源 + 换一个可信源”。否则 Composer 仍会尝试连 repo.packagist.org 并超时失败。
在离线机项目根目录执行:
- 禁用全局默认源:
composer config --unset repos.packagist - 添加本地镜像源(必须用 HTTP/HTTPS,不能用
file://):composer config repositories.offline-mirror composer http://127.0.0.1:8000 - 确认配置生效:
composer config repositories应只显示刚加的offline-mirror - 运行
composer install --no-interaction,此时所有请求都发向http://127.0.0.1:8000,无网络依赖
容易被忽略的三个细节
实际部署中,80% 的失败源于这三个点:
-
web/目录必须包含完整的packages.json+dist/子目录 + 所有 ZIP 文件,缺任一文件都会导致Could not find package xxx - HTTP 服务必须支持
Accept-Encoding: gzip,否则某些 Composer 版本会拒绝解析响应(Satis 默认生成的 JSON 已压缩) - 离线机 PHP 需启用
curl和openssl扩展——即使不联网,Composer 仍用 curl 发本地 HTTP 请求










