想问一下各位使用Composer的同学,通过Composer下载后的文件你们会把内容提交到Git上吗?
在官方的Faq上看到Should I Commit the dependencies in my vendor directory这篇文章,有建议是不提交到Git,那么应该如何处理切换分支就要重新composer install
这个问题呢?如果将vendor提交到版本库,那又应该如何处理包里面带有的.git文件夹呢?
*修正 composer update
应该为 composer install
事实上无论是分支开发,还是部署到生产环境,无论
composer.json
中版本号的通配符规则你怎么写,我们最关心的永远是一个最根本内容:开发当时,我们用的所有依赖库,具体的版本号是哪一个?而这个内容是
composer.lock
文件支持的。composer 本身通过维护 lock 文件,记录了依赖库产生任何改动之后,项目中所有依赖库的具体版本。请阅读关于此文件的文档。你应当永远把
composer.lock
文件提交到版本库,并在切换分支或部署之后,使用composer install
安装 lock 文件中指定的具体依赖版本。从这个意义上讲,你是否将
vendor
目录提交到主版本库都是对的。提交与否这是一个互有取舍的选择:如果提交:
优势:“拉取即用”的便利。
劣势:信息重复。因为你开发当时的具体版本,lock 文件已经记录。也就是说
vendor
文件夹表述了同一件事情。劣势:引入不一致性的风险。因为虽然 Composer 保证 lock 文件和
vendor
目录一致,但提交到 git 版本库毕竟是一个人工行为。你难以保证哪一次不会落下二者之一。如果不提交,优劣势反过来。不再重复。
我的想法是:我建议你坚持“正确性优于易用性”的思想。我的建议是不提交
vendor
,仅仅使用 lock 文件维持开发当时的依赖库版本。如果提交的话,请务必遵循以下两个准则:
(1)务必保证
vendor
和composer.lock
这两个文件的提交是同步的。提了一个,必须提另一个。任何开发,如果任何一次 commit 只交了其中一个,必须追责。
这个的理由是:虽然我们提交
vendor
保证拉取下来立刻可用,但是 git 是有部分检出(checkout)功能的 —— 对于一个 Composer 项目,我有权遵照 Composer 项目的惯例,不检出vendor
目录,而是拉取下来实务代码之后随手一个composer install
,你不能说我错。(如果谁说这个是错的,我支持你分分钟上sf和知乎曝光你的无良公司和技术主管)
(2)务必按照Composer对于提交
vendor
文件夹的建议,忽略掉子库的所有.git
目录,只提交vendor
中的实务代码。相信我,
vendor
中的实质代码,和vendor/**/.git
下git库本身的管理用文件,绝对是冰山的水上部分和水下部分的关系。不忽略,会死人的,不夸张。另外必须指出的是:分支开发时,就算不通过版本库同步
vendor
,而只同步composer.lock
,也不会造成时间的浪费。两个分支切换时,无非是两套具体版本换来换去。而 Composer 本身对所有下载的库都是缓存的。每次拉分支之后的
composer install
必然命中全部的缓存,而不需要重复消耗下载的时间。