composer install 严格按 composer.lock 还原依赖快照,不读取 composer.json 的新约束、不更新 lock 文件;提示“Nothing to install or update”表示 vendor 与 lock 完全匹配,属正常行为。

composer install 只安装 lock 文件中锁定的版本,不读取 composer.json 的新版本约束,也不会更新 lock 文件。 它不是“跳过更新”,而是严格按 composer.lock 还原依赖快照——这是 CI/CD、生产部署和多人协作中确保环境一致的核心机制。
为什么执行 composer install 却提示 “Nothing to install or update”?
这通常不是错误,而是预期行为。它说明:
-
composer.lock已存在,且当前vendor/目录下所有包的版本、哈希、路径都与 lock 文件完全匹配 -
composer.json虽有修改(比如加了新 require),但没运行composer update或composer install --no-dev等触发重写 lock 的操作 - 你可能误以为“install 就该装新东西”,其实它只做「还原」:有 lock → 按 lock 装;没 lock → 退化为 update(不推荐)
composer install 的典型使用场景
以下情况必须用 composer install,而非 composer update:
- CI 流水线(GitHub Actions / GitLab CI)中构建镜像:靠
composer.lock锁死 PHP 包版本,避免因上游 minor 更新引入非预期变更 - 生产服务器首次部署或回滚:
git checkout切到某 commit 后,该 commit 对应的composer.lock是可信快照,install能精确复现当时依赖状态 - 团队开发中新成员 clone 项目:只要项目已提交
composer.lock,运行install就能获得和主分支完全一致的 vendor 结构,无需担心本地composer.json中 ^1.2.0 解析出 1.2.5 还是 1.2.9
常见参数组合与风险点
几个关键开关直接影响行为,容易被忽略:
-
--no-dev:跳过require-dev中的包(如 phpunit、phpstan)。上线时必加,否则可能把测试工具打进生产镜像 -
--optimize-autoloader(或-o):生成优化的 classmap,提升自动加载性能。生产环境建议加上,但会增加 install 时间 -
--ignore-platform-reqs:绕过 PHP/扩展版本检查。仅限调试用,线上禁用——它可能导致 runtime fatal error,比如装了只支持 PHP 8.2 的包却跑在 8.0 上 - 不加任何参数时,若本地没有
composer.lock,install会自动执行一次update并生成 lock,这会破坏“只还原”的语义,务必提前确认 lock 是否存在
composer install --no-dev --optimize-autoloader
这个命令组合才是生产部署的标准写法:不装 dev 依赖、启用优化自动加载、严格按 lock 还原。最容易被忽略的是「lock 文件是否真的被 git 提交」——如果 .gitignore 里误写了 /composer.lock,那每次 install 实际都在做 update,整个一致性保障就失效了。










