离线环境配置composer只读私有仓,核心是禁用packagist.org并使用artifact或path类型仓库:artifact需预置命名规范的.tar.gz包且配置本地url;path需本地含有效composer.json的目录并显式声明于repositories中。

离线环境配置 Composer 只读私有仓,核心不是“连上一个服务”,而是让 composer install 完全不发 HTTP 请求——必须用 artifact 或 path 类型仓库,且必须全局禁用 packagist.org。
为什么 type: "composer" 仓库在离线时大概率失败
很多人尝试把 Satis 或 Artifactory 的地址写成 {"type": "composer", "url": "http://192.168.1.100/"},以为只要本地起个 Web 服务就能用。但实际运行 composer install -v 会看到它仍试图请求 http://192.168.1.100/packages.json,而一旦网络不通、DNS 不可达、或 HTTPS 证书校验失败(比如自签名证书未信任),整个流程就卡住。
根本原因:Composer 的 composer 类型仓库默认启用 secure-http,且会做完整元数据链路验证(包括 packages.json → provider-*.json → ZIP URL)。离线机没有可信 CA、无法解析内网域名、甚至压根没配 DNS,这些都会导致静默 fallback 到 Packagist,最终报错 Could not fetch。
- 除非你已部署好带正确证书的 HTTPS 服务 + 内网 DNS 解析 + 全局
secure-http: false配置,否则别指望type: "composer"真正离线可用 -
type: "vcs"更不行——它依赖git clone,离线机没 Git、没 SSH 密钥、没auth.json权限,直接报No valid composer.json was found - 真正能离线“只读”的只有
artifact和path,它们跳过所有远程协议栈,直读本地文件系统
artifact 仓库:适合部署场景,包必须提前打包好
artifact 是 Composer 原生支持的纯离线类型,不联网、不解析、不重试,只按 composer.lock 中的 dist.shasum 去指定目录找对应 .tar.gz 文件。它不关心包从哪来,只校验文件存在性和 SHA256。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 所有包必须提前在联网机生成,命名严格为
vendor-name/package-name-version.tar.gz(如monolog/monolog-2.13.0.tar.gz) - 每个
.tar.gz内必须含合法composer.json,且其中name和version必须与文件名完全一致 - 所有压缩包扁平放在同一目录(如
/opt/artifacts/),不能嵌套子目录 - 离线机执行:
composer config repositories.offline '{"type":"artifact","url":"/opt/artifacts/"}' - 务必同时执行:
composer config --global repo.packagist false,否则仍可能触发 DNS 查询
path 仓库:适合开发调试,源码目录即仓库
当你手头已有私有包源码(比如一个还没发布到 GitLab 的内部组件),path 是最轻量的离线方案。它不下载、不解压、不校验 hash,直接把本地目录当包源读取。
- 目标目录下必须有完整
composer.json,含name(如"acme/utils")和version(或使用分支名如"dev-main") - 项目
composer.json中声明:{"type": "path", "url": "./packages/acme-utils"}(推荐相对路径,避免跨机器失效) - 安装命令必须显式指定版本约束:
composer require acme/utils:dev-main@dev(注意@dev后缀不可省) - Windows 用户注意:
url若用绝对路径,需带盘符并用正斜杠,如"C:/projects/acme-utils" - 默认行为是创建符号链接(Linux/macOS)或复制(Windows),若要强制复制并避免软链失效,加
"options": {"symlink": false}
禁用 Packagist 的坑:配置位置和优先级必须全清空
即使你写了 "repositories": [{"type":"artifact",...}],composer install 仍可能连外网,常见原因是 Packagist 没被彻底关掉。
- 必须运行:
composer config --global repo.packagist false(全局关) - 检查项目级是否残留:
composer config repo.packagist输出应为空;如果显示composer https://packagist.org,说明项目composer.json的repositories数组里还藏着一条 Packagist 配置,得手动删掉 -
composer install --no-network是最后保险,但它只阻止下载,不阻止元数据请求——真正的断网靠的是配置层面的彻底移除 - 用
composer install -v观察输出:如果出现Downloading https://repo.packagist.org/packages.json,说明某处配置没生效,别信“我已经关了”
离线环境下最易被忽略的点:不是包怎么放,而是 Composer 默认行为太“固执”——它总想连 Packagist 查一查,哪怕你只缺一个包。关掉它的念头,比准备好包本身更难。










