因为公司的项目开始得早,公司用的是yii1的版本,我们团队是用git进行版本管理的,因为yii1几本是把所有的php代码都签入到git上的,所以,在团队有新人进来时,只要把git服务器上的代码克隆到本地就可以直接进行开发了,在初始化开发人员的本地项目时基本没碰到什么问题,当然,这里只说yii1对应的php项目代码,如果是完整的项目,还会包括前端项目的初始化,比如node.js(包括了npm)、grunt、vue等前端环境的搭建,这个已经超出php和yii范畴,就不深入了。
相对于yii1,yii2在框架的完整性上更加完善,甚至考虑到了团队协作开发和版本升级的一些细节。
今天我们就来说说,yii2的项目在团队开时,如果有新成员进入团队,通过git服务器,初始化本地开发环境的步骤。
这里先说一下我以前的一个经历,我个人是用yii2的,然后通过互联网的git云平台管理我的项目代码,通过git我可以在不同电脑间同步我的开发项目。
直到有一天,我在一台新电脑上执行codecept测试命令:
.\vendor\bin\codecept run -c api
既然出现了如下的错误(为了截图,我故意重现了当时的环境):

我很纳闷,为什么在另外一台电脑上执行这个命令是没问题的,这个codeception-local.php文件为什么在我这台电脑上没有存在,但是在另外一台电脑上却有这个文件,我需要搞清楚它是怎么来的。
我之前在不同机器上同步我的yii2项目时,用的是如下的步骤:
1 从git服务器上克隆代码到本地开发环境
2 执行composer install命令安装yii2项目和我在开发过程中引用的第三方组件
3 手动在web目录下建立index.php文件,在config目录下建立:main-local.php、params-local.php,在对应新建的文件上完善相应的代码,通常是不同开发环境的数据库服务器配置。
4 配置web服务器
用上面的步骤,就可以在新的电脑上同步我的开发项目了,我用这样的步骤一直没有问题,直到出现上面的错误,发才意识到,我应该是哪里做错了
回顾一下,上面的步骤,会发现第三步手动建立index.php、main-local.php等文件好像是一个很傻的动作,为什么要手动建立呢?而不是同步呢?
关于为什么需要手动建立index.php、main-local.php文件这里要说明一下,这是yii2框架进一步考虑到团队开发协作的需求,在团队开发的时候,开发人员可能因为开发过程的需要或者本地环境不同,需要修改本地的配置文件,在一般的情况下,配置文件会纳入git仓库进行版本管理的,这样,他在提交代码的时候,就会把修改过的、只适合他本地环境的开发配置参数随着配置文件提交到服务器上去了,别的开发人员在拉取代码时他本地的配置参数就会被覆盖,并且,这新的配置参数可能不是这个开发人员所需要的,会影响他的开发工作,严重情况下可能会误删数据(比如开发环境有多个开发数据库的情况下),这样给团队协作造成了麻烦。
yii2为了完善这个问题,用了多个配置文件,并且对配置文件进行了分级的方法来解决这个问题。
首先,在默认的情况下,yii2项目的git管理模板会忽略掉web目录下的index.php文件,config目录下的:main-local.php、params-local.php...等文件,只要是文件名里带有local的文件都会忽略掉。
然后,在项目里,yii2框架对配置文件进行了优先级区分,优先级顺序分别是: app\config\main-local.php > app\config\main.php > common\config\main-local.php > common\config\main.php,其中app代表某个yii2的项目,在不同的配置文件里,key名相同的配置项,会按优先级进行覆盖,就因为这个优先级覆盖加上local的配置文件不包含到git仓库中,让开发人员可以灵活、大胆的配置本地参数,按照自己具体的需求配置参数且不会覆盖别人的配置参数了。
说明了上面的规则,还是没有解决我纳闷的问题:那个codeception-local.php是怎么来的,在另外一台为什么有这个问题件?经过一番对比,我终于发现,我在从git仓库同步代码,初始化本地yii2开发项目时,少了一个步骤:执行yii2的init命令。
在查看了init命令的代码文件后在上面的初始化步骤里,第三步是很傻的,main-local.php等文件是不用手动建立的,在第三步,只要执行init命令,初始化本地的yii项目开发环境,就会自动建立main-local.php等本地文件了。
所以正确的步骤是:
1 从git服务器上克隆代码到本地开发环境
2 执行composer install命令安装yii2项目和我在开发过程中引用的第三方组件
3 在yii2项目的总根目录下,执行 init命令,记得,在提示里有提示要不要覆盖已存在的配置文件的,这时,记得选择:不覆盖:

从图上可以看出,codeception-local.php文件就是在这个步骤建立的,并且,红框里选择的是“不覆盖”
4 配置web服务器
这个时候,其实我们还另外一个发现:就是yii2项目高级模板里的environments项目到底是干嘛用的,其实我们执行init命令的时候,yii2框架是通过从environments目录里复制对应配置文件到具体项目的config文件里的,也就是说,我们可以在environments项目里配置我们统一的main-local.php配置文件,然后一样纳入git仓库,这样,在团队成员初始化项目开发环境时,就可以直接从environments项目里初始化,不用像我开始一样傻兮兮的自己手动建立了,这就是yii2项目环境变量的用途。
我们如果新增了一个yii2的项目,需要在environments项目中增加相应的配置文件,这样团队成员就可以通过纳入git仓库的environments项目同步到main-local.php等配置文件了。