不该把 vendor/ 提交进 git,composer.lock 必须提交;vendor 是可再生的平台相关产物,提交会导致历史膨胀、环境不一致;composer.lock 是依赖精确快照,缺失将使 install 退化为 update,破坏环境一致性。

不该把 vendor/ 提交进 Git,composer.lock 必须提交——这是 Composer 与 Git 协作最核心的两条铁律。其他所有配置和操作,都是围绕这两点展开的。
为什么不能提交 vendor/ 目录
因为 vendor/ 是可再生的产物,不是源码。它包含平台相关二进制(比如 ext-redis 的编译结果)、符号链接、甚至临时文件,不同机器上生成的内容天然不一致。
- 一旦误提交,Git 历史会迅速膨胀,克隆变慢,diff 全是噪音
- CI 构建时若混入本地
vendor/,极易因路径或权限问题失败 -
git rm -r --cached vendor是补救唯一可靠方式;之后必须在.gitignore里加/vendor(开头的/很关键,防子目录误匹配) - 某些 IDE 或脚本会自动生成
vendor/,建议在项目根目录统一用.gitignore拦截,别依赖人工判断
composer.lock 必须提交且要常更新
composer.lock 不是“备份文件”,它是当前环境所有依赖的精确快照:每个包的版本号、commit hash、dist 文件校验值、autoload 映射路径全在里面。没有它,composer install 就退化成 composer update,结果不可控。
- 每次运行
composer require、composer remove或composer update后,composer.lock必定变更,必须和composer.json一起git add并commit - 团队中有人只改了
composer.json却没跑composer install,别人拉代码后会遇到Lock file is not up to date with composer.json - 合并 PR 时若出现
composer.lock冲突,优先保留目标分支(如main)的 lock 内容,再在当前分支执行composer update --lock重生成(不升级依赖,只对齐 lock)
私有 Git 仓库作为依赖怎么配
想从公司内部 GitLab 或 GitHub 私有库拉包?靠 repositories + require 组合,但要注意认证和格式细节。
- 在项目
composer.json的repositories数组里加一条:{"type": "vcs", "url": "git@github.com:org/private-package.git"} -
require中写法必须匹配被依赖包自身的name字段(如"org/private-package": "dev-main"),不是 URL 路径 - 推荐用 SSH 方式(
git@...),提前配好 SSH key;若用 HTTPS,需配置 token:composer config --global github-oauth.github.com your_token - 被依赖的私有包自身也得有合法
composer.json,至少含name和autoload,否则 Composer 识别为无效包
CI 流程里 composer install 怎么写才安全
CI 环境不能信任任何本地残留,命令必须显式、幂等、无交互。
- 生产部署用:
composer install --no-dev --no-interaction --optimize-autoloader(禁用 dev 依赖、跳过提示、生成优化 autoload) - 测试环境用:
composer install --no-interaction(保留require-dev,但不卡在交互提示) - 绝对不要在 CI 脚本里写
composer update—— 这会绕过composer.lock,导致构建不可重现 - 若 CI 报
Package not found,先确认是否漏提交composer.lock,再检查该包是否在repositories中声明且网络可达
真正容易被忽略的,是 .gitattributes 里对 composer.json 和 composer.lock 的换行符约束。Windows 和 Linux 混用时,LF/CRLF 差异会让 Git 误报“已修改”,进而导致 lock 文件被意外覆盖或提交失败。











