composer install才是“克隆”,因为它严格按composer.lock中记录的精确版本、哈希、URL安装,确保环境完全一致;composer update是“重建”,因它忽略lock、重算依赖,导致版本漂移和运行时错误。

必须用 composer install,且项目根目录下必须存在未被修改的 composer.lock 文件——这是唯一能还原原项目依赖环境的方式;composer update 会跳过 lock、重算依赖,导致版本漂移和运行时错误。
为什么 composer install 才是“克隆”,而 composer update 是“重建”
composer install 的行为是查表执行:它只读 composer.lock,按里面记录的每个包的精确版本号、Git commit hash(对 dev 包)、dist URL 和校验和下载安装,完全无视 composer.json 中的 ^2.0 或 ~3.5 这类范围约束。这才能保证你装的 guzzlehttp/guzzle 是 7.8.1 而不是 7.9.0,哪怕两者都满足 ^7.0。
composer update 则相反:它忽略 composer.lock,重新解析整个依赖图,求解“当前环境下满足所有约束的最新兼容版本”,并覆盖写入新 composer.lock。结果就是——你本地跑通了,CI 报 Class not found,线上偶发 ArgumentCountError。
- 常见错误现象:
git clone后直接composer update,然后发现vendor/里多了几个没在原项目中见过的包 - CI 流水线中误用
update→ 构建产物不一致,测试通过但线上崩溃 - 团队里有人只提交了
composer.json却漏掉lock→ 其他人install时自动退化为update,环境悄然分裂
composer install 执行前必须确认的三件事
缺一不可,否则大概率失败或装错:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
composer.lock文件必须存在且未被.gitignore忽略(检查命令:ls -la | grep composer.lock;若不存在,需先在原项目中运行composer update --lock生成) -
vendor/目录必须为空或不存在(composer install不会清理已有文件,混杂加载会导致Autoload error或类行为错乱) - PHP 版本和已启用扩展必须满足
composer.lock中"platform"字段声明(例如 lock 顶部有"php": ">=8.1.0",而你本地是 PHP 7.4,则会跳过部分包甚至报Your requirements could not be resolved)
同步私有包或自定义源时容易卡住的点
如果 composer.lock 里有来自 GitLab、私有 Satis 或本地路径的包,composer install 会严格按 lock 记录的源地址拉取——但它不会帮你配权限。
- 报
Cloning into ''或401 Unauthorized:说明缺少对应仓库的认证凭据,需提前在~/.composer/auth.json或项目级auth.json中配置 token - 使用
--repository-url参数临时指定源时,注意格式必须是合法 JSON(如{"type":"vcs","url":"/path/to/repo"}),否则报Invalid repository configuration - 私有包的
dist地址若含内网域名(如packages.internal.company),新环境 DNS 或网络策略不通,也会卡在下载阶段
遇到 composer.lock 冲突或损坏怎么办
lock 文件不是普通配置,它是整个依赖图的完整序列化快照,手动编辑合并极大概率出错。
- Git 合并冲突时,别删行、别留“这边/那边”字段;直接
git checkout --ours composer.lock(或--theirs)选一个干净版本 - 删掉
vendor/,再运行composer install—— 它会校验composer.json和刚恢复的 lock 是否匹配,不匹配则自动重写 lock(此时content-hash不一致是主因) - 若仍报
Your lock file does not contain a compatible set of packages,说明composer.json已被他人修改,先git pull拉最新,再composer install
最常被忽略的一点:composer.lock 里记录的 content-hash 是对 composer.json 内容的哈希值,手动改过 json 却没更新 lock,install 就会静默重写——这个细节决定了你看到的到底是“原样克隆”,还是“看似克隆实则重建”。










