昨天周一,是项目部后端团队的技术分享日,正好是我来负责这次分享,分享的题目之前就已经订好了,是《Composer的安装与使用》。今天手头不忙,总结一下,分享过程中掌握的Composer知识点。
总所周知,Composer 是 PHP 的一个依赖管理工具。它允许我们在自己的项目中申明项目所依赖的代码库,它可以帮助我们在项目中安装我们所声明依赖的代码库,并且解决各个代码库之间的依赖关系。说的直白点就是,如果我们的项目需要使用A库,我们可以直接去这个库的官方站点或者是Github上去下载A库的源代码,但是有的时候A库还依赖与B库,为了能够使用A库,我们还需要去找B库,并且还要讲B库下载下来安装上,,,这样一层套一层的依赖关系很麻烦,并且有的时候这种依赖关系我们也摸不清,怎么办那?Composer就是解决上述问题的,如果我们要安装A库,它会帮助我们将A库所依赖的所有的库都下载下来,库与库之间的依赖关系不需要我们在考虑了,很是方便。之前PHP项目开发,很少会提到代码库以及包等概念,大家第一次接触可能觉得不好理解。如果大家在*inx平台上,手动编译安装过软件的话,一定有过这样的体会,就是在编译安装的第一步configure的时候,经常回报错,提示什么什么不存在,没安装之类的。其实这就是上面提到过的依赖问题。平常我们在*inx安装普通的软件的时候,比如说在CentOS上安装zip等工具的时候,不会采用源码编译安装的形式,而是采用CentOS所提供的Yum包管理工具来安装,一条yum install 软件名称 的命令直接就搞定了,之所以能一条命令搞定,就是因为yum这个包管理工具为我们解决了依赖的问题,这样是不是容易理解点。(PS:我这里只是拿yum做一下对比,大家不要理解错了,Yum是包管理工具,但是Composer并不是包管理工具,是依赖管理工具。这是因为Composer是在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。)
另外,有同学说我们在PHP开发过程中可能很少接触到代码库依赖的问题,这里要特别说一下,现如今,网上已经有无数的高人在Github等代码托管网站上开源了大量的优秀的代码。我们如果有什么需要,可以直接去Github上查找是否有合适的代码,如果有可以直接拿来用,没必要自己造轮子。一来这样速度快,可以大大加快开发的速度,二来,Github上的代码库一般质量都很高,并且有后期维护与更新。所以现在的项目为了提高开发的速度以及提高代码的健壮性,都大量使用了第三方的代码库,这样一来,项目的依赖问题就会出现。
下面说一下Composer的原理,先来看原理图:
结合上面的原理图我们可以看出,composer是在Packagist.org(Composer官方站点)以及Github上将我们所需要的类库下载到我们的项目中,不过在安装我们需要的类库的时候,它会自动的分析出所依赖的类库有哪些,并同时下载下来,解决了依赖的问题。
OK,明白了基本的实现步骤,我们来看一下Composer的安装过程
1):在*inx环境下进行安装
执行命令: curl -sS https://getcomposer.org/installer | php 即可
执行完上面的命令,会下载一个名为composer.phar的二进制文件到你的当前工作目录下面,我们对composer执行的一系列的操作就要通过这个文件来实现。(PS:刚刚说过上面的命令会下载composer.phar文件到你当前的工作目录下面,如果需要下载到别的目录下面,可以通过--install-dir 选项进行制定具体希望的目录)
上面的安装方式其实是局部安装的,因为composer.phar文件只存在某一个目录下面,如果你要在别的目录下使用composer命令,就很麻烦,需要拷贝一份composer.phar文件到改目录下面。为了避免这样麻烦,我们可以使用全局安装的方式安装composer,使得composer.phar全局有效。实现起来也很简单,只要将composer.phar文件移动到系统的PATH目录下面就OK了。
2):在windows环境下进行安装
下载并且运行 Composer-Setup.exe,它将安装最新版本的 Composer。这样我们就可以在任何目录下直接使用 composer 命令进行操作了。
OK,完整了Composer的安装下面就要进行Composer的相关操作了,具体的操作步骤如下。
1:检查Composer是否正常工作----执行命令: php composer.phar
3:安装/更新依赖包----执行命令: php composer.phar install/update
4:Composer的一些其他的操作(这里只是列出常用的命令,有需要的可以去官网看文档)
1):初始化 init
命令如下: php composer.phar init
之前我们提到composer.json文件的时候,我们是说手动创建composer.json文件。实际上还有一个init 命令可以更容易的做到这一点。当您运行该命令,它会以交互方式要求您填写一些信息,同时使用一些默认值。
5:Composer的自动加载
对于composer的基本操作,很简单,没什么太大的问题,下面的我们来说一下composer的自动加载功能。我们之前提到过,composer会将第三方的类库下载到项目根目录下面的vendor目录下面,但是我们应该怎么使用这些下载好的类库那,类库可能有很多,我们总不能在项目中,一个一个的require进来吧。我们都知道,PHP的常用框架,都支持自动加载功能,方便我们加载类库,composer也提供了自动加载的功能。我们先说一下,实现的具体步骤,之后再说实现的具体的原理。
上面就实现了自动加载Monlog类了,很是方便。
然后我们执行php composer.phar update 命令, Composer就会注册一个遵循PSR-4规范的autoloader到Admin命名空间。这样我们就定义一个从命名空间到物理存储目录的映射,具体的映射关系是命名空间Admim对应了项目根目录/src/。此时src会在我们项目的根目录下面,与 vendor目录同级。比如说我们要在项目中调用Admin\Foo类,composer中的自动加载机制就会执行spl_autoload_register函数注册__autoload方法,得到该命名空间所对应的物理存储地址,然后去该存储地址下面加载Foo.php这个文件,然后实例化Foo这个类,是不是很方便。
上面我们自己定义autoload,是根据PSR-4编码规范来的,composer中的自动加载机制,除了支持上面提到的PSR-4规范以外,还支持PSR-0,classMap,Files等自动加载的形式。(PS:PSR-0,classMap我这里就不展开说了,不明白的同学的可以百度一下)。其实实现上述各种加载机制的原理都是建立命名空间与物理存储目录的映射关系。在vendor/composer目录下面,分别存在autoload_psr4.php,autoload_namespace.php,autoload_classmap.php以及autoload_file.php文件,它们分别对应上面的几种实现机制。Composer会将我们在composer.json中定义好的autoload配置转换为php代码的形式进行存储,当我们实例化某个类的时候会依次加载上面的文件中的映射关系,匹配到具体的物理地址,完成文件的加载以及类实例化操作。
下面,我就拿laravel框架下安装的monolog这个类库来说一下自动加载的具体的实现。
(1):在path/www/laravel/vendor/monolog/monolog下,安装的monolog库
monolog目录下的composer.json文件中的内容
可以看出,其定义了一个遵循PSR-4规范的autoload,在我们使用composer下载monolog的时候,composer就会将这条规则写入到刚刚提到的 autoload_psr4.php文件中。
看autoload_psr4.php中的内容: 生成了一条映射的关系,命名空间对应物理存储地址
加载autoload.php以后,看代码,直接将autoload_psr4.php等文件require进来,配合__autoload()函数完成自动加载
6:Packagist 镜像
OK,终于写完了。。。。