离线安装php依赖必须提前在联网机执行composer install --no-install --prefer-dist将zip包存入~/.composer/cache/files/,再复制缓存目录至离线机相同路径,并运行composer install --no-plugins --no-scripts等参数确保完全离线执行。

离线安装必须用 --prefer-dist 且提前下载 ZIP 包
Composer 默认在离线时会尝试解析 composer.lock 中的 dist.url 并校验 dist.shasum,但不会自动从本地磁盘读取 ZIP——它只查缓存目录 ~/.composer/cache/files/。所以光把 ZIP 文件丢进项目目录没用,必须让 Composer “看见”它。
关键不是放哪,而是怎么让它进缓存:
- 在联网机执行
composer install --no-install --prefer-dist,强制把所有dist包(ZIP/TAR)拉进本地缓存,不装 vendor - 缓存路径是
~/.composer/cache/files/vendor/name/version-hash/,文件名含哈希,不能重命名 - 打包整个
~/.composer/cache/files/目录(不是单个 ZIP),传到离线机相同路径下 - 离线机上先清空旧缓存:
composer clear-cache,再解压覆盖
composer install 离线运行必须加 --no-plugins --no-scripts
即使缓存齐备、vendor 存在,不加参数仍可能失败:插件(如 hirak/prestissimo)会初始化网络连接,脚本(post-install-cmd)可能调用 npm 或远程 API。这些行为默认触发,和是否有网络无关。
最稳命令是:
composer install --no-interaction --no-plugins --no-scripts --no-dev --optimize-autoloader
注意:--no-autoloader 会跳过 autoload.php 重建,必须后续补一记 composer dump-autoload -o,否则运行时报 Class not found。
本地 ZIP 包不能直接 require,必须走 path 仓库或 artifact 仓库
如果你手头只有某个包的 ZIP 文件(比如从 GitHub 手动下载的 monolog/monolog-3.5.0.zip),Composer 不支持 composer require ./monolog-3.5.0.zip 这种语法。它只认两种“本地源”:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
path 仓库:解压 ZIP 到目录,确保该目录下有合法
composer.json(含name和version),然后在项目composer.json的repositories中声明:{"type":"path","url":"./packages/monolog"} -
artifact 仓库:把 ZIP 放进一个空目录(如
artifacts/),然后声明:{"type":"artifact","url":"./artifacts/"}。注意:artifact 只匹配顶层包,子依赖仍需缓存或 path 补全
常见错误:Could not find a matching version of package monolog/monolog——不是 ZIP 没放对,是没告诉 Composer 去哪找,也没在 require 里写对版本约束(如 "monolog/monolog": "3.5.0")。
离线环境必须禁用 Packagist fallback
哪怕你只配了 artifact 或 path 仓库,只要全局配置里还留着 repo.packagist,Composer 在解析依赖时仍会尝试 fallback 请求 https://repo.packagist.org/packages.json,导致报错 Connection refused。
必须在离线机上执行:
composer config --global repo.packagist false
验证是否生效:composer config --global repo.packagist 应输出 false。漏掉这步,前面所有准备都白做。
真正麻烦的不是下载,是让 Composer 完全相信“这里就是全部源头”,连试探性请求都不发——它对网络的执念比你想象中深。










