search
HomeBackend DevelopmentPHP Tutorialcomposer下载的内容是否需要提交到git

想问一下各位使用Composer的同学,通过Composer下载后的文件你们会把内容提交到Git上吗?
在官方的Faq上看到Should I Commit the dependencies in my vendor directory这篇文章,有建议是不提交到Git,那么应该如何处理切换分支就要重新composer install这个问题呢?如果将vendor提交到版本库,那又应该如何处理包里面带有的.git文件夹呢?

*修正 composer update 应该为 composer install

回复内容:

想问一下各位使用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目录提交到主版本库都是对的。提交与否这是一个互有取舍的选择:

如果提交:

  1. 优势:“拉取即用”的便利。

  2. 劣势:信息重复。因为你开发当时的具体版本,lock 文件已经记录。也就是说vendor文件夹表述了同一件事情。

  3. 劣势:引入不一致性的风险。因为虽然 Composer 保证 lock 文件和vendor目录一致,但提交到 git 版本库毕竟是一个人工行为。你难以保证哪一次不会落下二者之一。

如果不提交,优劣势反过来。不再重复。

我的想法是:我建议你坚持“正确性优于易用性”的思想。我的建议是不提交vendor,仅仅使用 lock 文件维持开发当时的依赖库版本。

如果提交的话,请务必遵循以下两个准则:

(1)务必保证vendorcomposer.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必然命中全部的缓存,而不需要重复消耗下载的时间。

这个可以参考GitHub上的Laravel项目,https://github.com/laravel/laravel。

.gitignore文件:https://github.com/laravel/laravel/blob/master/.gitignore

也是很明显的不提交vendor文件夹。

首先如果你重来没有提交过 vendor 目录,切换分支也不需要 update,
其次正常情况下 vendor 下面的包是不带 .git 文件夹的。

至于需不需要提交 vendor 到git,这得看情况。
如果你是发布一个公开项目到 github,显然不需要提交,写好 composer.json 就可以了。
如果是私有项目,这看你是如何发布的。如果是打包,然后解压到服务器,可能需要提交,如果有更自动化的流程,比如自动更新,自动update,那你也可以不提交。

看你希望怎么管理项目,这方面没有定论,不过一个建议是应该把第三方库的版本依赖写确切,不要写通配,正常情况下也不要用composer update,第三方库又没问题为什么要update?除非你确实遇到第三方库当前版本有bug需要升级,或者你的新功能要依赖第三方库新版本的特性,不然你莫名其妙update干嘛?

一个准则,在开发任何新特性之前,第三方库的版本依赖就应该是确定的,这方面不能有含糊的地方,不然你这项目管理就是有问题了。

既然第三方库的版本确定,那么推不推vendor就是另外的问题了,如果你懒得部署时再install,那么大可以直接就推去远程把第三方库当成项目的一部分,这也是比较推荐的做法,因为打包捆绑的好处就是分发方便,这方面我是支持不忽略vendor的,当然更大的原因是天朝的网络……实在没法每次都重复等,妈蛋等啊等再好的撸码好心情也要等坏啊……

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),