composer怎么在不联网的情况下使用_composer离线模式【技巧】

2次阅读

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

composer怎么在不联网的情况下使用_composer离线模式【技巧】

离线安装 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 7ssl 错误

离线安装依赖:用 vendor 目录 + lock 文件 + –no-install

真正卡住离线用户的不是 Composer 命令本身,而是 composer install 默认尝试连 packagist.org。关键在于:不走网络解析,只按 composer.lock 里记录的精确版本和哈希,从本地已有包中“搬运”。

操作前提:你必须在另一台联网机器上完整执行过 composer install,生成了完整的 vendor/ 和准确的 composer.lock

  • 把整个项目目录(含 composer.jsoncomposer.lockvendor/)打包(如 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,都会让整个流程卡在最后一秒。

text=ZqhQzanResources