内网离线部署必须用dist缓存+--no-network,禁用path仓库;私有仓库需type=composer、url以/结尾、禁用packagist.org;CI前须清理path配置。

内网环境不能靠“配个本地路径”就装包——path仓库只适用于开发联调,生产或离线部署必须用 dist 缓存 + --no-network,否则必报 Could not find package。
为什么repositories.type: path在内网部署会失败
很多人把本地包目录加进 composer.json 的 repositories,设成 "type": "path",以为就能离线安装。实际一上服务器就崩,因为:
-
path依赖目标路径真实存在且可读,内网机上该路径通常根本不存在(比如./packages/my-utils是开发机相对路径) - Composer 不 fallback:路径不存在就直接报错,不会尝试其他源或缓存
-
name字段必须和require中的完全一致,大小写、斜杠都不能差,否则匹配失败 - Windows 下若没管理员权限或未启用开发者模式,
"options": {"symlink": true}会静默降级为复制,改代码不生效
composer install --no-network 必须配合 dist 缓存才能用
真离线(无任何外网能力)下,--no-network 不是开关,而是“强制只读缓存”的断言。它不下载、不解析、不 fallback,只校验并解压 ZIP —— 所以缓存必须提前备好、位置必须对、路径必须全局配置。
- 联网机执行:
composer install --prefer-dist --no-scripts --no-plugins,所有 ZIP 落入~/.composer/cache/files/ - 把整个
files/目录拷到离线机固定路径(如/opt/composer-cache) - 离线机运行:
composer config --global cache-dir /opt/composer-cache - 再跑:
composer install --no-network --prefer-dist—— 此时它才真正跳过网络
私有 Composer 仓库(Satis/Nexus)配置三要素缺一不可
如果内网已搭了 Satis、Artifactory 或 Nexus 的 Composer 类型仓库,光填 URL 是不够的,常见静默失效是因为漏了以下任一条件:
-
repositories.type必须是"composer",不是"vcs"或空值 -
url必须以/结尾(如https://pkgs.internal/),否则拼出的packages.json路径 404 - 项目级
composer.json必须同级声明"packagist.org": false,否则默认仍先连外网
这三项任意一个错,Composer 都不会报错,只会默默 fallback 到 packagist.org,然后超时或 404。
别在生产环境留 path 配置,CI 构建前务必清理
path 是开发期临时方案,进不了构建产物。CI 脚本里一旦用了 composer install,而 composer.json 还带着 repositories.type: path,就会在构建机上因路径缺失失败。
- 上线前必须从
composer.json彻底删掉整个repositories块 - 更稳妥的做法是用不同配置文件隔离:开发用
composer.dev.json,CI 用COMPOSER=composer.prod.json composer install - Git 提交前检查
composer.json是否含"type": "path",CI 可加脚本校验防止误提
最容易被忽略的是:即使你没手动写 path,某些 IDE 或工具生成的 composer.json 模板可能自带示例,上线前不扫一眼,就等着凌晨三点收告警。











