离线部署composer项目必须提前在联网机固化依赖、生成元数据并切断远程回退路径,否则install必报could not fetch或package not found;核心是确保vendor与composer.lock严格一致,并用--no-plugins --no-scripts --no-autoloader防止意外联网。

离线部署 Composer 项目不是“关掉网络就能跑”,而是必须提前在联网机固化依赖、生成可信元数据、并切断所有远程回退路径;否则 composer install 在内网必然报 Could not fetch https://repo.packagist.org/packages.json 或 Package not found。
为什么 composer install 在没网时直接失败
Composer 默认行为是:读 composer.lock → 拉取 packages.json 元数据 → 校验每个包的 dist.url 和 dist.shasum → 下载 ZIP 或 clone Git。只要其中任一环节缺本地依据,它就立刻联网,不缓存、不降级、不提示“试试本地”。
-
composer.lock缺一个dist.shasum字段?→ 报错退出,不尝试用已有的 vendor 目录 - 某个包标记为
"type": "source"(比如用了"dev-main"或 Git URL)?→ 离线时无 ZIP 可校验,install 中断 - PHP 版本或
platform.config不匹配?→ 即使 vendor 存在,也会因平台约束拒绝加载,而非跳过
最稳的离线命令组合:composer install --no-plugins --no-scripts --no-autoloader
这不是可选优化,而是防止意外联网的硬性防护。它跳过三类高风险环节:
-
--no-plugins:避免插件(如composer-asset-plugin)初始化时访问 GitHub/CDN -
--no-scripts:屏蔽post-install-cmd等脚本,防止它们调用外部 API 或下载资源 -
--no-autoloader:跳过自动加载器重建——某些自定义 autoloader 实现会隐式触发远程类查找
⚠️ 前提:vendor 目录必须完整存在,且与 composer.lock 中记录的每个包路径、版本、shasum 严格一致。执行前建议先运行 ls -la vendor/ | head -20 看是否明显缺失目录。
离线添加新包的唯一可靠方式:type: "path" 仓库
composer require 默认必须联网查包名和版本,离线不可用。想加新包,只能让 Composer 把本地目录当仓库用:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 把目标包(含完整
composer.json)放到项目内,如./packages/my-utils - 在项目根目录的
composer.json中添加:"repositories": [<br> { "type": "path", "url": "./packages/my-utils" }<br>] - 运行
composer require vendor/my-utils:dev-main(注意必须用dev-分支名,path仓库不认^1.0这类约束) - 装完立刻执行
composer dump-autoload,否则autoload.php不会包含该包
⚠️ 容易踩的坑:url 必须是相对路径;包名必须和其 composer.json 中的 "name" 完全一致;子依赖也得用同样方式提供,否则安装中断。
别信 COMPOSER_DISABLE_NETWORK=1 能兜底
这个环境变量只禁用网络请求,但不解决元数据缺失问题。常见失效场景:
-
composer.json里写了"repositories": [{"type": "packagist", "url": false}]—— 这种写法在COMPOSER_DISABLE_NETWORK=1下会直接报错退出,不是静默忽略 - 全局配置里还留着
repo.packagist,哪怕项目级已禁用,Composer 仍会 fallback 并触发校验 - 某个依赖在
composer.lock中标记为"source"类型(比如用了"dev-master"或 Git URL),这种无法走 dist 缓存,离线时无 ZIP 可校验
真正有效的禁用方式只有一种:composer config --global repo.packagist false,再配合项目级 composer config repository.my-local composer https://intranet/packagist/。
复杂点在于:离线不是“没网就行”,而是要确保每行 shasum 都对得上、每个 dist.url 都能被本地文件系统映射、且所有 PHP 平台约束在打包时就已固化——少一个条件,内网服务器上就可能突然报错,而不是给你机会调试。










