离线迁移composer依赖必须提前准备composer.phar、vendor/目录、composer.lock及完整缓存,离线机需预装匹配php版本的composer.phar并设composer_disable_network=1、禁用packagist源,否则install会因网络请求失败。

必须提前在有网机器上准备好 composer.phar、vendor/ 目录、composer.lock 和所有依赖包的本地缓存,离线机上只负责执行 —— 缺一不可,少一个环节就会卡在 Could not fetch https://repo.packagist.org/packages.json。
离线机上必须预装的 Composer 二进制文件
离线机不能运行 curl -sS https://getcomposer.org/installer | php,必须提前从联网机导出 composer.phar。关键不是“有没有 Composer”,而是“有没有带校验的、匹配 PHP 版本的 composer.phar”:
- 在与目标环境一致的 PHP 版本下(比如 8.2.12),用官方脚本下载并校验哈希,再生成
composer.phar - 拷贝后加执行权限:
chmod +x composer.phar,建议软链到/usr/local/bin/composer - 别用 apt/yum 安装 —— 版本老旧(如 Ubuntu 22.04 自带的是 2.2.x),不兼容 PHP 8.2+ 的新特性,且默认启用远程 repo
项目级离线部署必须携带的三件套
仅靠 composer.phar 不足以完成离线安装;真正触发 install 行为的是这三样东西是否齐备、是否匹配:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
vendor/目录:可直接复制,但前提是源与目标的 PHP 版本完全一致(小版本号差一位都可能因内部 API 变更导致Class not found) -
composer.lock文件:必须一并拷贝,且不能被编辑;否则composer install会尝试重算依赖并联网校验 - PHP 扩展:目标机必须已启用
mbstring、openssl、zlib(curl不强制,但部分插件会依赖);缺一个,autoload.php就加载失败
为什么 vendor 存在还报错?核心是元数据校验没绕过
即使 vendor/ 和 composer.lock 都在,composer install 默认仍会联网请求 Packagist 元数据(比如确认包是否存在、版本是否合法)。这不是 bug,是设计行为 —— 你必须显式切断它:
- 必须设环境变量:
COMPOSER_DISABLE_NETWORK=1;不设这个,所有--no-xxx参数都无效 - 必须删掉全局配置里的 packagist fallback:
composer config --global repo.packagist false,否则它会悄悄回退到远程 - 若
composer.json里写了"repositories": [{"type": "packagist", "url": false}],COMPOSER_DISABLE_NETWORK=1下会直接退出,不是忽略 - lock 文件中含
"source"类型条目(如 Git URL 或dev-master)时,离线无法校验,install 必然失败 —— 这类包必须提前用--prefer-dist强制走 zip 包
想离线加新包?只能走 path 仓库,别碰 require
composer require 在离线环境下完全不可用 —— 它必须联网查包名、解析版本约束、校验签名。唯一可行路径是把本地目录当仓库用:
- 目标包根目录下必须有合法
composer.json,含完整"name"(如"acme/utils")和"version"或分支标识(如"dev-main") - 项目根目录
composer.json中添加:"repositories": [{"type":"path","url":"./packages/my-utils"}](注意:Windows 要写盘符,如C:/projects/my-pkg) - 然后运行:
composer require acme/utils:dev-main(版本号必须和本地包的composer.json严格一致) - path 仓库默认创建符号链接(Linux/macOS)或复制(Windows),不是静态副本;若目标机不允许 symlink,需额外配置
"options": {"symlink": false}
最容易被忽略的点是:离线环境里没有“试错成本”。COMPOSER_DISABLE_NETWORK=1 和 repo.packagist false 必须在第一次运行 composer install 前就生效,而不是等报错后再补 —— 因为一旦某次命令触发了网络请求,Composer 就可能写入临时状态或缓存,后续再禁用也未必能彻底干净。










