composer create-project在离线机上必失败,因其强制联网解析packages.json且不支持离线模式;唯一可行路径是联网机制作含完整vendor/的离线包,离线机用composer_disable_network=1 composer install --no-plugins --no-scripts --no-autoloader校验后执行composer dump-autoload -o。

直接说结论:composer create-project 在离线机上必失败,它根本不是为离线设计的;所谓“一键构建离线包”,实际是分步固化 + 强制隔离,关键动作只有三步:联网机生成完整 vendor/、打包时剔除风险文件、离线机用 COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader 校验后补 composer dump-autoload -o。
为什么 composer create-project 离线一定挂
这个命令本质是远程克隆模板仓库(如 topthink/think)再执行 composer install,第一步就硬编码访问 https://repo.packagist.org/packages.json。哪怕你把 composer.phar、composer.lock、甚至整个 vendor/ 都拷过去,它仍会报:
Could not fetch https://repo.packagist.org/packages.jsonPackage topthink/framework not found
COMPOSER_DISABLE_NETWORK=1 对它无效;--offline 参数不存在;它不读本地缓存、不认已有 vendor/、也不支持跳过元数据校验。
离线包必须含 vendor/ 目录,不能只传 composer.lock
composer.lock 只存哈希、版本和 dist URL(比如 "url": "https://api.github.com/.../zipball/..."),不含任何代码。离线时 Composer 仍会尝试请求这个 URL,或拉取 packages.json,结果就是连不上、报错退出。
- 删掉
vendor/再跑composer install,等于让 Composer 凭空造包 -
composer archive只打项目源码,不包含vendor/,解压后require 'vendor/autoload.php'必然报错 - 真正能落地的离线包,必须含完整
vendor/目录,且打包前要清理风险项:
删掉:vendor/bin/(Windows 软链在 Linux 失效)、vendor/composer/installed.json(含绝对路径哈希,易导致 autoload 异常)
离线机还原时,composer install 必须加这四个参数
很多人解压完就直接跑 composer install,结果还是连网失败——默认行为仍会校验远程元数据,哪怕 vendor/ 已存在。
- 先设环境变量彻底断网:
COMPOSER_DISABLE_NETWORK=1(Linux/macOS)或set COMPOSER_DISABLE_NETWORK=1(Windows) - 运行:
composer install --no-plugins --no-scripts --no-autoloader—— 跳过插件初始化、脚本执行、autoload 重建,只做 lock 与 vendor 的一致性校验 - 最后强制刷新加载器:
composer dump-autoload -o,否则大概率报Class not found
⚠️ 前提:源机和目标机的 PHP 版本(含小版本)、扩展(ext-zip、ext-openssl、ext-mbstring)、架构(x86_64 vs aarch64)必须完全一致。差一点,vendor/ 里就可能出现语法错误或扩展调用失败。
后续想增删包?只能用 type: "path" 仓库
composer require 默认必须联网查包名和版本,离线不可用。唯一可靠方式是把本地包目录当仓库用:
- 把目标包(含完整
composer.json)放到项目内,如./packages/my-utils - 在项目根目录
composer.json中添加:"repositories": [{"type":"path","url":"./packages/my-utils"}] - 运行:
composer require vendor/my-utils:dev-main(注意必须用dev-*分支名,path仓库不认^1.0这类约束)
别指望 composer update 或 composer install --no-install 能在离线机上“自动补依赖”——它们都依赖远程元数据,没网就卡死。真要动态管理,就得提前在联网机做完所有变更,再走一遍完整 vendor 打包流程。











