composer怎么实现离线模式安装?

3次阅读

composer install 跳过网络请求需设 composer_disable_network=1 并确保 composer.lock 完整,因离线时仍校验元数据;vendor 存在却报错是因默认读 packagist.org;离线不可 update,仅能同步开发机生成的 lock 文件。

composer怎么实现离线模式安装?

composer install 时如何跳过网络请求?

Composer 本身没有“离线模式”开关,但可以通过预下载依赖 + 禁用远程仓库的方式强制走本地缓存。关键不是关掉网络,而是让 composer install 完全不尝试访问 packagist.org 或其他配置的仓库。

实操建议:

  • 确保所有依赖已通过 composer installcomposer update 在有网环境完整执行过一次,这样 vendor/composer.lock 都是完整的
  • 运行前设置环境变量:COMPOSER_DISABLE_NETWORK=1linux/macos)或 set COMPOSER_DISABLE_NETWORK=1windows CMD)
  • 加上 --no-plugins --no-scripts 更稳妥,避免插件触发额外网络调用
  • 不要动 composer.json 里的 repositories 配置——哪怕只是注释掉一条,COMPOSER_DISABLE_NETWORK=1 下也会报错退出

为什么 vendor 目录存在、lock 文件也对,还是报 “Package not found”?

常见错误现象:明明 vendor/ 里已有包,composer install 却提示 Package xxx is not available...。根本原因不是缺文件,而是 Composer 在安装前仍会校验元数据——它默认要读 packagist.org 的包信息,哪怕最终不用下载。

解决路径只有两条:

  • COMPOSER_DISABLE_NETWORK=1 + 完整的 composer.lock(含所有包的 dist.urldist.shasum
  • 或者提前用 composer archivecomposer dump-autoload 配合 --classmap-authoritative 减少运行时依赖,但这不能绕过 install 阶段的校验
  • 注意:composer install --ignore-platform-reqs 不解决网络问题,它只跳过 PHP 扩展版本检查

离线环境下怎么更新 lock 文件?

不能更新。这是最容易踩的坑:composer update 必须联网,COMPOSER_DISABLE_NETWORK=1 下直接报错。所谓“离线更新”,实际是换机器操作:

  • 在有网机器上跑 composer update,生成新 composer.lock
  • 把新 composer.lock 和(可选)vendor/ 打包带走
  • 目标离线机只运行 composer install,且必须确保 composer.lock 里的每个包的 dist.url 指向的是本地路径(比如 file:///path/to/archives/xxx.zip)——但这需要提前用 composer config repositories.0 type path 配置本地仓库,且维护成本高
  • 更现实的做法:离线机只做 install,不 update;所有变更都在开发机完成并同步 lock 文件

vendor 压缩包缓存能当离线源用吗?

不能直接当源用,但可以省下载时间。Composer 缓存目录(~/.composer/cache/files/)里存的是 zip 包和 metadata,但 install 过程中不会自动查这个缓存来替代网络请求。

如果你控制部署流程,可以:

  • composer install --prefer-dist --no-progress 确保走 dist 分发(zip 包)而非 source(git clone)
  • 手动把 ~/.composer/cache/files/ 整个复制到离线机相同路径,再设 COMPOSER_CACHE_DIR=/path/to/cache
  • 但前提是离线机的 Composer 版本、PHP 版本、平台架构与原机器一致,否则 shasum 校验失败会回退尝试网络下载

真正可靠的离线方案,永远依赖两件事:一份未被篡改的 composer.lock,和一个完全不碰网络的执行环境。中间任何环节松动,就会漏请求。

text=ZqhQzanResources