离线安装 Composer 依赖必须完整传输 vendor 目录、禁用网络和插件脚本,并强制重生成 autoload;仅拷贝 composer.lock 会因远程元数据校验失败或环境不一致导致“Package not found”或运行时类加载错误。

离线安装 Composer 依赖,不能只拷 composer.lock 就跑 composer install——它会报 “Package not found” 或静默跳过包,根本原因是没提前把所有子依赖拉全、没禁掉插件/脚本的网络调用,或 PHP 环境不一致导致 autoload 失败。
为什么 vendor 目录存在却 still 报错 “Package not found”
常见现象:目标机上 vendor/monolog/monolog 明明有文件,composer install 却提示 monolog/monolog is not available。这不是文件缺失,而是 Composer 在 install 阶段仍尝试校验远程元数据(哪怕最终不用下载)。
- 根本触发点是默认读
packagist.org,即使vendor/已存在,只要没显式禁用网络,它就会发起 HTTP 请求 -
COMPOSER_DISABLE_NETWORK=1是必须项,否则任何--no-xxx参数都拦不住初始校验 - 若
composer.lock里某个包的dist.url是https://开头(而非file://),且没配本地仓库,COMPOSER_DISABLE_NETWORK=1下会直接退出 - 验证是否真离线:临时加
127.0.0.1 packagist.org到/etc/hosts,再跑composer install -v,看到Connection refused才算到位
离线部署唯一可靠路径:完整 vendor + lock + 禁插件脚本
别信“只传 composer.lock + composer.json”,也别指望 composer archive 打全量——它不处理子依赖。真正能落地的只有完整 vendor/ 目录打包。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在线机执行:
composer install --no-dev --prefer-dist --optimize-autoloader,确保所有子依赖进vendor/,且无 dev-only 文件 - 打包前删掉:
vendor/bin/(Windows 软链失效)、vendor/composer/installed.json(含绝对路径,引发 autoload 异常) - 目标机解压后,必须运行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - 最后补一记:
composer dump-autoload -o,强制刷新 autoloader,避免因路径变更或旧缓存导致类找不到
私有包和 platform 不兼容是静默失败重灾区
离线时最危险的不是报错,而是“看起来成功了,运行时报 Class not found”。这类问题往往源于 composer.lock 里写了不兼容的约束,而 Composer 默认跳过、不提醒。
- 检查
composer.json中是否有"minimum-stability": "dev"或"prefer-stable": false——它们会让锁文件记录dev-master这类不稳定版本,离线时无法解析 - 确认
composer.lock里每个包的version字段是语义化版本(如2.10.0),不是dev-前缀;可用composer update --lock强制重写 - 若锁文件里有
"require": {"php": ">=8.2"},但目标机是 PHP 8.0,Composer 会跳过该包安装(不报错!),后续require时才崩 - 私有 Git 包(如 GitLab)必须提前换为
path类型仓库,或把对应代码 clone 到本地并声明:{"type": "path", "url": "/path/to/local/package"}
缓存目录迁移不如 vendor 直传,但适合 CI 场景
如果部署流程是“CI 构建 → 推镜像 → 运行容器”,那预迁移 COMPOSER_CACHE_DIR 比打包整个 vendor/ 更轻量。但它对环境一致性更敏感。
- 在线机先查缓存路径:
composer config --global cache-dir,通常是~/.composer/cache - 执行一次完整
composer install --prefer-dist,确保所有包以 zip 形式落进cache/files/ - 把整个
cache/目录复制到目标机,并设环境变量:COMPOSER_CACHE_DIR=/path/to/cachedir - 离线机运行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-interaction --prefer-dist --no-plugins --no-scripts - 注意:
cache格式随 Composer 版本变化,务必保证离线机的composer --version与在线机一致
真正麻烦的从来不是“怎么拷”,而是“拷完能不能跑”。PHP 版本、扩展(ext-zip、ext-openssl)、SAPI 类型(CLI/FPM)、甚至 umask 权限,都可能让 vendor/autoload.php require 失败。上线前务必在目标环境用真实 PHP SAPI 执行一次 require 'vendor/autoload.php';,别只信 composer install 的输出。

















