【发布时间】:2016-05-15 09:17:30
【问题描述】:
我最近从svn 切换到git,我有点困惑。
在yii2框架中,有很多.gitignore文件,我了解这些文件的用途。但我有点困惑为什么vendor 目录被忽略了。
我的开发和生产环境都需要其中的文件。
我曾经在使用svn 时将文件提交到那里,但我做错了吗?如果我忽略vendor 目录,正确的做法是什么。
每次推送时我是否需要在两个环境中运行composer update?
【问题讨论】:
我最近从svn 切换到git,我有点困惑。
在yii2框架中,有很多.gitignore文件,我了解这些文件的用途。但我有点困惑为什么vendor 目录被忽略了。
我的开发和生产环境都需要其中的文件。
我曾经在使用svn 时将文件提交到那里,但我做错了吗?如果我忽略vendor 目录,正确的做法是什么。
每次推送时我是否需要在两个环境中运行composer update?
【问题讨论】:
没错。通常你不会提交供应商的东西,因为那里的第 3 方代码在其他地方受版本控制。您应该使用 composer 来处理更新供应商特定的代码。这意味着每次部署应用程序时都应该运行composer update,除非您已经拥有所有供应商代码并且您需要的内容没有任何更新。
【讨论】:
composer update 之后,开发机器和生产机器都应该具有相同的版本。除此之外,这只是一个建议。如果您知道,将供应商文件夹置于版本控制之下是完全可以的。但是在进行作曲家更新时,那里的代码可能会被覆盖。
正如@chris 所说——毕竟这只是一个建议,您可以选择是否上传和维护供应商库。要了解它的工作原理,请在您的应用程序中访问 composer.json,您会看到如下内容:
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": ">=2.0.6",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*"
},
"require-dev": {
"yiisoft/yii2-codeception": "*",
"yiisoft/yii2-debug": "*",
"yiisoft/yii2-gii": "*",
"yiisoft/yii2-faker": "*"
},
如果需要,您可以在其中编辑和设置任何库的特定版本。现在走这条线:
"yiisoft/yii2-bootstrap": "*"
每次您执行composer update Composer 时,都会从 packagist.org(查看它here)获取其 repo,将安装找到的最后一个稳定版本( "*" 的意思)然后将解决它的依赖关系,这可以在 \vendor\yiisoft\yii2-bootsrap\composer.json 中看到:
"require": {
"yiisoft/yii2": ">=2.0.6",
"bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*"
},
最后一行将保证安装最后一个稳定版本的 Twitter Bootstrap 3.3.x。
这些是在请求packagist.org 后下载的确切版本的确切库,并在您每次从任何机器执行composer update 时保存到供应商文件夹。如果您将 twitter bootstrap 3.3.2 与您的项目一起作为示例上传,并且团队成员无需执行 composer update 即可将其下载回来,那么他可能会发现自己陷入了一个应该解决的问题3.3.3 版本以及如果他只是进行更新,他永远不需要知道哪里。
这就是作曲家团队回答问题时所说的:Should I commit the dependencies in my vendor directory?:
一般建议是不...
...虽然在某些环境中提交它可能很诱人,但它会导致 几个问题:
- 更新代码时 VCS 存储库大小和差异。
- 在您自己的 VCS 中复制所有依赖项的历史记录。
- 将通过 git 安装的依赖项添加到 git 存储库会将它们显示为子模块。这是有问题的,因为它们不是真实的 子模块,你会遇到问题。
如果每个项目都必须与供应商一起上传,那么还要考虑应该为 github.com 分配多大的额外磁盘空间。想想那里可以找到多少完全相同的 twitter bootstrap 副本。
【讨论】: