离线安装前必须准备三类临时文件:完整的vendor/目录(需同环境生成并保留权限)、未改动的composer.lock(不含source类型条目)、与目标环境一致的composer.json(禁用repositories或设为本地)。

离线安装前必须准备哪些临时文件
离线安装不是“不联网就能跑”,而是把所有依赖元数据和代码实体提前固化成可搬运的文件集合。缺任何一环,composer install 都会在校验阶段失败。
核心就三样:完整的 vendor/ 目录、未改动的 composer.lock、以及一份与目标环境完全一致的 composer.json(尤其是 config.platform 和 require 声明)。
-
vendor/必须是用相同 PHP 版本 + 扩展(mbstring、openssl、zlib、zip)生成的;不能只拷vendor/autoload.php或部分子目录 -
composer.lock不能有"source"类型条目(如"type": "git"或"url": "git@github.com:..."),否则离线时无法解析源码位置 -
composer.json中若含"repositories",必须全部设为本地类型(如path)或显式禁用:composer config --global repo.packagist false
为什么 vendor 目录不能直接 tar -cf 就完事
直接 tar -cf vendor.tar vendor/ 看似省事,但容易漏掉关键内容或引入权限/路径污染。
常见问题包括:
-
vendor/bin/下脚本丢失执行权限(Linux/macOS 下需rsync -a或tar -p保留权限) -
.gitignore或.gitattributes导致某些包的dist构建产物被排除(比如前端资源、预编译类) - 宿主机 UID/GID 与目标容器不一致,解压后文件属主变成
root,PHP 进程读不到 →Class not found - Windows 生成的
vendor/拷到 Linux 容器,换行符或路径分隔符引发 autoload 加载失败
稳妥做法是:在与目标环境**完全一致的 PHP 环境中**(同版本、同扩展、同 OS)执行 composer install --no-dev --prefer-dist --no-progress,再用 rsync -a --exclude='*.git' vendor/ vendor-dist/ 整理后打包。
COMPOSER_DISABLE_NETWORK=1 不是运行时加的,是环境准备的一部分
这个环境变量不是命令执行前临时 export 就能生效的“开关”,而是离线操作的**前置契约**——它决定了 Composer 是否允许进入任何可能触发网络调用的代码路径。
没设它,哪怕你把 127.0.0.1 packagist.org 写进 /etc/hosts,composer install 仍会尝试 DNS 解析、TLS 握手、HTTP 请求,最后卡在 Could not fetch https://repo.packagist.org/packages.json 并退出。
- Dockerfile 中应写:
ENV COMPOSER_DISABLE_NETWORK=1(而非 RUN 前加前缀) - CI 脚本中应在 job 级别设置该变量,确保所有子命令继承
- 若用
php -d variables_order=EGPCS启动,需确认该变量未被覆盖
最易忽略的一点:这个变量对 composer dump-autoload 无影响,但它会让 composer update、composer require、composer create-project 全部立即失败——所以离线环境里,这些命令根本不能出现。


















