离线安装composer需分三步:先下载官方phar文件并设为可执行以启用命令;再通过完整复制含vendor和lock的项目目录执行composer install –no-scripts –no-plugins –no-dev实现依赖离线安装;最后用–prefer-source配合本地git仓库实现离线更新。

离线安装 Composer 本体:提前下载好二进制文件
Composer 本身没有官方“离线模式”开关,所谓离线使用,本质是绕过网络请求——前提是所有依赖包和 Composer 自身都已就位。第一步得让 composer 命令能在断网机器上跑起来。
官方提供预编译的 PHAR 文件,可直接下载后重命名为 composer 并设为可执行:
- 在联网机器上访问 https://www.php.cn/link/594ca739e3609243a6b6a3dd8d871114,找到最新稳定版的
composer.phar链接(如https://getcomposer.org/installer不推荐,它会联网校验) - 用
wget或浏览器下载该 PHAR 文件,例如:wget https://getcomposer.org/composer-stable.phar -O composer - 运行
chmod +x composer,然后复制到离线机器的/usr/local/bin/或任意$PATH目录下 - 验证:
./composer --version应正常输出版本号,不报curl Error 7或 ssl 错误
离线安装依赖:用 vendor 目录 + lock 文件 + –no-install
真正卡住离线用户的不是 Composer 命令本身,而是 composer install 默认尝试连 packagist.org。关键在于:不走网络解析,只按 composer.lock 里记录的精确版本和哈希,从本地已有包中“搬运”。
操作前提:你必须在另一台联网机器上完整执行过 composer install,生成了完整的 vendor/ 和准确的 composer.lock。
- 把整个项目目录(含
composer.json、composer.lock、vendor/)打包(如tar -cf project-offline.tar .),复制到离线机器 - 解压后,**不要删
vendor/,也不要改composer.lock**,直接运行:composer install --no-scripts --no-plugins --no-dev -
--no-scripts和--no-plugins能避免某些插件触发网络回调;--no-dev减少非必需包数量,降低哈希校验失败概率 - 如果提示
Package X not found,说明vendor/缺包或路径不对——Composer 不会自动补全,它只校验已有内容是否匹配lock中的dist.sha256
离线更新依赖:用 –prefer-source + 提前 clone 的 Git 仓库
想在离线环境“升级”某个包?composer update 默认必须联网。唯一可行路径是:把目标包的源码(通常是 github/gitlab 仓库)提前 clone 到本地,并用 --prefer-source 强制 Composer 用本地 Git 目录代替 dist 包。
- 在联网机器上:
git clone https://github.com/symfony/console.git /path/to/local/symfony-console - 在项目根目录创建
repos/目录,把克隆好的仓库放进去(保持目录名与包名一致,如repos/symfony/console/) - 修改
composer.json,添加仓库配置:"repositories": [ { "type": "path", "url": "./repos/symfony/console" } ] - 离线机器上运行:
composer require symfony/console:dev-main --prefer-source --no-update,再composer update symfony/console——此时它会跳过 packagist,直接 link 本地路径 - 注意:
"type": "path"仓库不支持版本约束(如^6.4),只能指定分支或 commit hash;且composer.lock中的source字段会记录绝对路径,迁移时需同步调整
常见报错与绕过点:SSL、DNS、packagist 域名硬编码
即使你没写 composer install,某些场景仍会悄悄发请求:比如 PHP 启用了 openssl.cafile 但证书路径无效,或 Composer 内部尝试查 repo.packagist.org 的 DNS。
- 错误
cURL error 60: SSL certificate problem:离线机器没 CA 证书包?别碰composer config -g secure-http false(这会破坏安全性),改用export COMPOSER_DISABLE_TLS=1+composer config -g secure-http false双关,仅限测试环境 - 错误
Could not resolve host: repo.packagist.org:检查/etc/hosts是否有该域名的错误映射;或临时加export COMPOSER_HOME=/tmp/composer避免读取全局配置里的镜像源 - 最隐蔽的坑:
composer create-project永远联网,无法离线;必须用git clone+composer install替代 - PHP 版本差异也会影响:PHP 8.1+ 默认禁用
allow_url_fopen,而某些旧版 Composer PHAR 依赖它——离线前务必确认 PHP 运行时配置兼容
离线不是加个参数就能开的模式,它是对依赖生命周期的一次完整预演:所有包、所有哈希、所有路径,都得提前对齐。漏掉一个 vendor/autoload.php 的相对引用,或者 composer.lock 里多了一行没同步的 source.reference,都会让整个流程卡在最后一秒。