离线安装Composer依赖需确保缓存完整、lock文件可信且环境一致:检查缓存目录中dist包shasum是否匹配,确认PHP与Composer版本及扩展完全相同,并使用COMPOSER_DISABLE_NETWORK=1配合--no-plugins --no-scripts --no-autoloader等参数强制禁用网络。

离线安装依赖不是“关掉网络就能装”,而是让 composer install 完全不触发任何 HTTP 请求——这只有在缓存已就位、锁文件可信、且所有元数据校验能本地完成时才成立。
怎么确认缓存目录里真有你要的包?
Composer 缓存(~/.composer/cache/files/)只存 dist 包(ZIP/TAR),不存 source 或 git clone 数据。如果 composer.lock 里某项的 "type": "git" 或 "dist": {"url": "https://..."} 指向的是私有 Git 地址,那它根本不会进默认缓存。
- 运行
composer show vendor/package --all查看该包是否被标记为dist类型;不是就说明它不会从缓存加载 - 检查
composer.lock中对应条目是否有"dist": {"shasum": "xxx", "url": "https://..."}—— 离线时这个url不重要,但shasum必须匹配缓存中对应 ZIP 文件的校验值 - 手动进缓存目录查:比如 monolog/monolog v2.4.0 的缓存路径通常是
~/.composer/cache/files/monolog/monolog/abc123.zip,文件名由 shasum 决定
迁移缓存前必须对齐 Composer 版本和 PHP 平台约束
不同 Composer 版本生成的缓存结构不兼容;PHP 版本或扩展缺失会导致 install 静默跳过某些包,后续运行时报 Class not found 而非安装失败。
- 在源机器运行
composer --version和php -v,目标机必须完全一致 - 检查
composer.json中"platform"字段(如"php": "8.2.0"),目标机 PHP 小版本不能低于此值 - 若用
--prefer-dist,确保所有包都支持 dist 安装——有些私有包只提供"type": "package"+"source",这种必须换 artifact 或 path 方式
离线机执行 install 时最关键的三个参数
composer install 默认仍会尝试访问 packagist.org 做元数据校验,哪怕 vendor 已存在。必须显式压制这些行为。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 加
--no-plugins --no-scripts:防止 post-install-cmd 等钩子因缺网络卡死或报错 - 加
--no-autoloader:避免 autoload 生成阶段读取远程配置(某些插件会干这事) - 必须设环境变量
COMPOSER_DISABLE_NETWORK=1:这是硬开关,强制跳过所有仓库请求;仅靠--no-interaction不够
正确命令是:COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader --prefer-dist --no-interaction
为什么有时明明缓存拷过去了,install 还是去联网?
最常被忽略的是 composer.lock 里某个包的 dist.url 是 HTTPS 地址,而 Composer 在离线模式下发现缓存中没有匹配 shasum 的 ZIP,就会 fallback 到报错或尝试重试——但它不会告诉你“缓存缺失”,只会卡住或报 Failed to download。
- 验证方式:加
-v参数运行 install,看日志里是否出现Loading from cache;若看到Downloading...就说明缓存没命中 - 补救办法:回到联网机,用
composer require vendor/package --update-with-dependencies强制拉一次完整依赖树,再重新打包 cache - 注意 artifact 仓库可绕过这个限制——把所有 ZIP 放进
./packages/archives,再配"type": "artifact",Composer 会直接扫描目录,不查远程也不依赖 shasum 匹配逻辑
缓存迁移看着简单,实际成败取决于 lock 文件、缓存内容、PHP 环境三者是否严丝合缝。少一个条件,COMPOSER_DISABLE_NETWORK=1 就只是让你更快地看到报错而已。

















