必须设COMPOSER_DISABLE_NETWORK=1,否则必联网请求packages.json而失败;cache-dir不控ZIP路径,需正确配置cache-files-dir指向含/files的绝对路径,且artifact仓库要求包命名、结构、校验严格匹配。

能离线安装,但必须设 COMPOSER_DISABLE_NETWORK=1,否则所有“离线操作”都只是幻觉——它会坚持去请求 https://repo.packagist.org/packages.json,报错后直接退出。
为什么设了 cache-dir 还是联网失败?
因为 cache-dir 只控制元数据缓存(如 packages.json 分片)存放位置,不控制 ZIP 包路径;而离线时真正要用的是 cache-files-dir,它必须指向含 /files 后缀的绝对路径,例如 /opt/composer-cache/files。
-
cache-files-dir配错(比如漏掉/files或用了相对路径),Composer 会回退到默认~/.composer/cache/files,离线机上这个目录通常为空 - 执行过
composer config --global --unset cache-dir,否则旧配置可能覆盖新设置 - 在线机下载依赖时必须用
--prefer-dist,才能把 ZIP 包写进cache-files-dir对应的/files子目录
artifact 本地仓库怎么配才真正离线?
artifact 是唯一原生支持纯离线的仓库类型,不探测网络、不 fallback,但包命名和结构有硬性要求。
- 压缩包必须严格按
vendor-name/package-name-version.tar.gz命名,例如monolog/monolog-2.13.0.tar.gz - 每个包内必须含合法
composer.json,且name和version字段要与文件名完全一致 - 所有
.tar.gz文件必须平铺在一个目录下(不能嵌套子目录),例如/opt/artifacts/ - 离线机执行:
composer config repositories.offline '{"type":"artifact","url":"/opt/artifacts/"}' - 后续
composer install会根据composer.lock中的dist.shasum查找并校验文件,失败直接报错,不尝试联网补救
path 仓库 require 本地包为什么还报 Could not fetch?
因为没关 Packagist fallback 行为。即使写了 "type": "path",Composer 默认仍会尝试查远程源验证包是否存在,除非彻底切断。
- 必须全局禁用:
composer config --global repo.packagist false - 检查项目级配置:
composer config repo.packagist输出应为空,不能是composer https://packagist.org - 项目
composer.json的repositories段里不能残留指向https://packagist.org的条目 -
require时必须带@dev或分支名(如dev-main),不能用版本约束(如^1.0) - 包根目录下
composer.json必须含完整name和version(或branch-alias),且name大小写要与require写的一致
最易被忽略的点:离线环境下 composer install 即使 vendor 目录已存在,也必须重跑一次来重建 autoload 映射;而 dump-autoload -o 这步若跳过,运行时几乎必然报 Class not found——它不是可选优化,是加载前提。











