离线配置是内网PHP项目运行前提,未正确配置会导致composer install卡在“Could not fetch packages.json”;必须显式设置cache-files-dir为含/files后缀的绝对路径、启用COMPOSER_DISABLE_NETWORK=1、禁用packagist源,并使用path仓库或Satis镜像管理私有包。

离线配置不是“多一个选项”,而是内网 PHP 项目能跑起来的前提——没配对,composer install 就会卡在 Could not fetch https://repo.packagist.org/packages.json,连 vendor 目录都进不去。
cache-files-dir 必须显式设置,且路径末尾要带 /files
很多人以为设了 cache-dir 就够了,结果离线一跑还是重下。因为 Composer 的缓存是分层的:repo/ 存元数据(断网即失效)、archived/ 存解压后归档(不参与离线复用),只有 files/ 下的 ZIP 才会被 --prefer-dist 直接读取并校验。
-
cache-dir只是父目录,它不控制 ZIP 写到哪;真正起作用的是cache-files-dir -
cache-files-dir必须指向含/files后缀的绝对路径,比如/mnt/offline-cache/files,不能是/mnt/offline-cache - 如果之前设过
cache-dir,得先清掉:composer config --global --unset cache-dir,否则旧配置会干扰 - 验证是否生效:运行
composer diag,看Cache files directory行是否和你设的一致
COMPOSER_DISABLE_NETWORK=1 是硬开关,不是可选参数
不加这个环境变量,所有 --no-xxx 都白搭。Composer 在 install 阶段默认仍会尝试请求远程元数据,哪怕 vendor/ 和 composer.lock 全都在本地。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 加了
COMPOSER_DISABLE_NETWORK=1后,composer install才会跳过所有 HTTP 请求 - 但前提是
composer.lock里每个包的dist.url必须是本地路径或相对路径;如果是https://开头,会直接退出 - 推荐组合命令:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - 执行完必须补一记:
composer dump-autoload -o,否则运行时大概率报Class not found
私有包不能靠 create-project,得用 path 仓库或 Satis 镜像
composer create-project 在离线机上必挂,它设计上就强制联网解析模板元数据,--offline 参数不存在,COMPOSER_DISABLE_NETWORK=1 也拦不住第一步。
- 离线初始化唯一可行路径:联网机上
git clone骨架 →composer install --prefer-dist --no-dev→ 打包整个目录(含vendor/和composer.lock)→ 拷到离线机 - 想在离线项目中加新包?只能用
"type": "path"仓库,比如{"type": "path", "url": "./packages/my-private-lib"},但这要求包代码已存在本地磁盘 - 大规模私有包管理必须用 Satis:生成静态
packages.json+ ZIP 归档,再通过"type": "composer"指向内网地址;同时必须全局禁用 Packagist:composer config --global repo.packagist false - Satis 构建时务必启用
"require-dependencies": true和"archive",否则子依赖缺失,离线机install会静默失败
最易被忽略的一点:权限。即使路径、配置全对,如果 PHP 进程用户(如 www-data)对 cache-files-dir 或 Satis 输出目录没有 stat() 权限,Composer 就会静默 fallback 到重下——不会报错,只会让你以为“配置生效了”。

















