离线安装composer依赖必须提前在联网环境生成composer.lock并下载完整zip包,直接复制vendor目录最可靠;若需后续增删包,须用--repository-url=file://指向本地zip库。

能用,但必须提前准备,不能临时抱佛脚
离线安装前,必须在联网机上生成 composer.lock 并完整下载依赖
没有 composer.lock,composer install 在离线环境下一定会报错,比如 Could not fetch https://repo.packagist.org/packages.json。它不是“没网就装不了”,而是“没锁文件就根本不敢装”。
- 在与目标环境一致的联网机器上(PHP 版本、扩展如
mbstring、curl都要匹配),先确保项目有composer.json - 运行
composer install --no-dev --prefer-dist --optimize-autoloader:强制走 ZIP 包、跳过开发依赖、生成扁平化自动加载器 - 确认
vendor/目录已生成,且vendor/autoload.php可被正常require - 务必保留
composer.lock—— 它是离线还原的唯一依据,删了就等于重头联网解析
最简单可靠的方式:直接迁移 vendor/ + autoload.php
这不是“偷懒”,而是对离线场景最务实的选择。只要源环境和目标环境 PHP 兼容性一致,复制过去就能跑。
js网站后台用户登录界面,通过原生javascript代码验证表单,当用户输入的用户名不正确或者没有填写的情况在,在下面给出提示信息,登录页面我们一般用在网站的后端或者前端的会员登录部分!
- 把整个
vendor/目录、composer.lock、composer.json一起打包迁移到离线机 - 入口文件中显式写死路径,比如
require '/opt/myapp/vendor/autoload.php';,避免依赖当前工作目录 - 如果迁移后类找不到,不要立刻重装,先运行
composer dump-autoload --classmap-authoritative重建权威类映射 - 不推荐只复制
vendor/后再执行composer install—— 它仍可能触发插件、脚本或 autoload 重建逻辑,意外发起网络请求
想支持后续增删包?得用 --repository-url=file:// 指向本地 ZIP 包目录
纯复制 vendor/ 适合固定版本部署;若需在离线环境中灵活 require 新包,就得让 Composer 从本地文件系统读取 ZIP。
- 在联网机上,把
~/.composer/cache/files/下所有.zip文件(按vendor/name/hash.zip结构)整体拷贝到离线机,例如/opt/composer-dist/ - 离线机执行:
composer install --no-dev --prefer-dist --repository-url=file:///opt/composer-dist/ - 该命令会严格按
composer.lock中记录的dist.shasum查找对应 ZIP,校验失败即报错,不会退而求其次 - 常见失败原因:某个包在
composer.lock里标记为"source"类型(比如用了dev-master或 Git URL),这种没法打包成 ZIP,必须改用稳定版约束
禁用网络不是万能解药,--no-network 有副作用
设置 composer config --global disable-network true 或 COMPOSER_DISABLE_NETWORK=1 看似一劳永逸,但容易掩盖真实问题。
- 它会让所有远程操作静默失败,比如插件初始化、某些 post-install-cmd 脚本、甚至部分 autoload 生成逻辑可能异常退出而不报错
- 更稳妥的做法是:不设全局禁用,而是在每次安装时显式加
--no-network,并配合--no-scripts --no-plugins明确屏蔽非核心行为 - 如果项目用了私有 Git 仓库,
--no-network会导致git clone直接卡死,此时必须提前转为dist方式或改用artifact仓库类型
真正离线的关键,从来不是命令参数,而是你有没有在联网时把 composer.lock 的每一行、每个 dist.shasum 对应的 ZIP 文件,都实实在在落到硬盘上。漏一个 hash,离线安装就断在那一步,不会提醒你缺什么,只会报“package not found”。









