composer install 不等于远程安装,因其默认只读取本地 composer.lock、不访问远程仓库;真实部署需全量校验、走镜像源、验证签名,而本地缓存会掩盖网络与校验逻辑。

为什么 composer install 不等于远程安装?
本地执行 composer install 默认只读取当前项目下的 composer.lock,完全不访问 Packagist 或任何远程仓库——哪怕 lock 文件里记录的是 GitHub 上的某个 commit。这跟“模拟远程安装”有本质区别:真实部署时,CI/CD 或生产服务器往往要从零拉取依赖,验证签名、校验 hash、走镜像源,甚至跳过某些平台特定包(如 ext-redis 在无扩展环境会报错)。你真正想复现的,是那个「没缓存、没 vendor、全量校验、按 lock 严格还原」的过程。
用 composer install --no-cache 强制清空本地缓存再拉取
Composer 缓存(~/.composer/cache)会让 install 看起来快得反常,掩盖网络层和校验逻辑。加 --no-cache 后,它会:
- 跳过所有本地 tarball 和 dist 缓存,强制重新下载每个包的 zip/tar 包
- 仍使用
composer.lock中的 exact version 和 hash,但重新校验完整性 - 触发
dist模式(而非source),更贴近线上默认行为
注意:如果某包在 lock 中标记为 "source": true(比如开发中 require 了 git 分支),--no-cache 不会改变其 source 行为,此时需额外加 --prefer-dist 强制走 dist。
用 composer install --ignore-platform-reqs 绕过扩展/PHP 版本检查
远程 CI 环境常禁用某些扩展(如 ext-gd),或 PHP 版本略低,导致 install 直接失败。本地模拟时若不想配一模一样的环境,可用:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--ignore-platform-reqs:跳过所有platform约束(php,ext-*,lib-*) -
--ignore-platform-req=ext-redis:只忽略指定扩展,更精准
⚠️ 这不是“修复兼容性”,而是暴露问题:如果线上真缺这个扩展,运行时才会崩。本地用这个参数只是让 install 走完,别误以为能正常跑起来。
用 COMPOSER_REPO_PACKAGIST=https://packagist.org 切换镜像源验证行为
国内常配阿里、腾讯镜像,但它们同步有延迟,且部分私有包不镜像。要确认 lock 文件能否在标准源下还原,临时切回官方源:
COMPOSER_REPO_PACKAGIST=https://packagist.org composer install --no-cache
关键点:
- 该环境变量只影响本次命令,不影响全局配置
- 如果失败,大概率是 lock 里用了非 Packagist 托管的包(如 private repo 或 GitHub URL),需检查
repositories配置是否被忽略 - 若项目用了
path类型 repository,--no-cache不影响它,但远程环境通常没有该路径,必须提前移除或替换
最易被忽略的其实是 lock 文件本身的时效性:它记录的是「当时 resolve 出来的 exact commit」,但 Git 仓库可能已被 force push 覆盖,或 tag 被删。模拟再准,也救不了一个已失效的 commit hash。










