加了 composer_disable_network=1 仍失败,因其仅阻断主流程 http 请求,无法拦截插件、post-install-cmd 脚本及硬编码远程校验;必须组合使用 --no-plugins、--no-scripts、--no-dev 才能彻底离线。

报错“Could not fetch https://repo.packagist.org/packages.json”或卡在Downloading,说明 Composer 正在强行联网——离线时它不会自动 fallback 到本地缓存或 vendor 目录,必须人工切断网络路径并显式对齐缓存状态。
为什么加了 COMPOSER_DISABLE_NETWORK=1 还会失败
这个环境变量只拦住主流程的 HTTP 请求,但拦不住以下三类行为:
-
hirak/prestissimo等插件会在 post-install 阶段自行发起并发下载 - 包自带的
post-install-cmd(如执行npm install或生成前端资源)可能调用file_get_contents或cURL -
bin字段声明的二进制(如phpunit)触发硬编码的远程校验逻辑,哪怕--no-scripts也绕不过
所以必须组合使用:COMPOSER_DISABLE_NETWORK=1 + --no-plugins + --no-scripts + --no-dev。Windows 用户注意:CMD 中要用 set COMPOSER_DISABLE_NETWORK=1 && composer install ...,PowerShell 中用 $env:COMPOSER_DISABLE_NETWORK="1"。
composer install 离线时到底读哪些文件
它不只看 vendor/ 和 composer.lock,还依赖三处本地数据同时存在且匹配:
-
composer.lock中每个包必须含"dist": {"shasum": "xxx", "url": "https://..."}字段(即由--prefer-dist生成) - 对应 ZIP 文件必须已落盘到
cache-files-dir下的vendor/name/sha256hash.zip路径(不是随便拷个 ZIP 就行) -
cache-dir/repo/https---packagist.org/packages.json必须存在且非空,否则元数据解析失败
检查是否完整:运行 composer config --global cache-dir 查出路径,进入其 repo/ 子目录,确认 packages.json 是合法 JSON;再进 files/,用 ls monolog/monolog/*.zip 看是否有匹配 shasum 的文件。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
用 path 类型仓库加载本地包时 require 怎么写
这不是“安装离线包”,而是让 Composer 把你硬盘上的代码当包源来用,关键点很具体:
- 项目
composer.json的repositories字段里必须显式声明:{"type": "path", "url": "./packages/my-lib"}(url支持相对路径,但 Windows 上推荐用正斜杠或双反斜杠) - 本地包目录下必须有有效的
composer.json,且name字段要和require中的完全一致(大小写、vendor 名都不能差) -
require写法只能是"my-vendor/my-lib": "dev-main",不能写"^1.0"或"*";如果分支叫develop,就得写dev-develop - 本地包目录必须是 Git 仓库(至少一个 commit),否则 Composer 拒绝识别
执行命令是 composer require my-vendor/my-lib:dev-main,不是 install,也不是全量 update。
离线机上 vendor 没生成或不完整,最常忽略的三点
即使你把完整的 vendor/ 目录拷过去,composer install 仍可能只生成部分目录甚至报错:
- PHP 版本不一致:比如锁文件里某包要求
php >=8.1,而离线机是 8.0.30,错误不会提示版本问题,而是直接Class not found - 扩展缺失:
ext-zip是解压 dist 包必需的,ext-json用于解析 lock 文件,ext-curl即使离线也可能被插件内部调用 - 缓存路径没对齐:只拷了
~/.composer/cache/files/,却没同步设置cache-files-dir,Composer 仍去读默认路径下的空files/
真正可靠的离线部署,是把 vendor/ + composer.lock + composer.json 打包带走,然后在目标机用 COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --optimize-autoloader 强制重建 autoload 映射——而不是指望它从缓存里“重新下载”。










