Composer的安装与使用以及自动加载的实现

昨天周一,是项目部后端团队的技术分享日,正好是我来负责这次分享,分享的题目之前就已经订好了,是《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

            如果返回一个可执行的命令列表,就说明Composer安装配置没有问题,可以正常使用。
      2: 在项目根目录下创建 composer.json 文件
          composer.json文件是我们用来定义项目代码依赖的。我们可以根据需要将所需的代码库的名称以及版本号添加到该文件中。这样我们在执行composer操作的时候,composer将会检测该文件,并根据文件内容为我们安装指定的代码库。
         格式如下:
         {
           "name": "laravel/laravel", -------包名称
           "description": "The Laravel Framework.",
           "keywords": ["framework", "laravel"],
           "license": "MIT",
           "type": "project",
           "require": { ------申明项目依赖的库
                            "php": ">=5.5.9", ----库名以及版本号
                            "laravel/framework": "5.2.*"
                           }
        }

     3:安装/更新依赖包----执行命令: php composer.phar install/update

         执行上面的命令,composer会找到composer.json文件中我们在require所指定的类库,并将它下载到当前目录下的vendor目录。(PS:这是一个惯例把第三方的代码下载到一个指定的目录vendor目录下。如果是需要下载monolog库将会创建 vendor/monolog/monolog目录)
        另外在我们第一次执行install命令的时候将会创建一个composer.lock文件到我们项目的根目录中。composer.lock顾名思义是composer的锁文件。在安装依赖后,composer将把安装时确切的版本号列表写入composer.lock文件中。这将锁定该项目的所依赖的库的特定版本。如果不存在composer.lock文件,composer将读取composer.json并创建锁文件。(PS:这里举例说一下composer.json与composer.lock两则在控制类库版本上的作用。说如果我们将自己的代码上传到网上,供别人下载使用,如果我们的代码库依赖monolog这个日志库,那么我们在使用composer安装这个库的时候,可能定义的版本号是1.1.*,实际下载下来的库的版本是1.1.1,那么composer.lock文件中所记录的monolog的版本号就是1.1.1。别人通过composer安装我们上传的代码库的时候,就会根据composer.lock文件中所记录的确切的版本号下载类库,也就说只会下载1.1.1版本,别的版本不会下载。如果我们没有composer.lock文件,就有可能,下载下来1.1.n版本,这样也就有可能会导致代码出现问题,因为我们的代码库是根据1.1.1来开发,现在你安装的版本是1.1.n,就有可能出现问题。)如果我们依赖的依赖的库版本有了更新,可以使用update命令。它将获取最新匹配的版本(根据你的composer.json文件)并将新版本更新进锁文件。
      更新命令:php composer.phar update
      如果只想安装或更新一个依赖,你可以白名单它们:
      php composer.phar update monolog/monolog [...]

   4:Composer的一些其他的操作(这里只是列出常用的命令,有需要的可以去官网看文档)

       1):初始化 init

        命令如下:   php composer.phar init       

        之前我们提到composer.json文件的时候,我们是说手动创建composer.json文件。实际上还有一个init 命令可以更容易的做到这一点。当您运行该命令,它会以交互方式要求您填写一些信息,同时使用一些默认值。

      2):show----列出所有可用的软件包,你可以使用 show 命令。
          命令如下: php composer.phar show
          如果你想看到一个包的详细信息,你可以输入一个包名称。
          php composer.phar show monolog/monolog
     3):depends----该命令可以查出已安装在你项目中的某个包,是否正在被其它的包所依赖,并列出他们。
         命令如下: php composer.phar depends --link-type=require monolog/monolog
     4):create-object---该命令可以从现有的包中创建一个新的项目。这相当于我们执行了一个 git clone 或 svn checkout命令。
         命令如下: composer create-project laravel/laravel ----laravel安装方式
    5):search----该命令允许你为当前项目搜索依赖包,通常它只搜索 packagist.org 上的包
        命令如下: php composer.phar search monolog
    6):require ----该命令增加新的依赖包到当前目录的 composer.json 文件中。
        命令如下: php composer.phar require
        在添加或改变依赖时, 修改后的依赖关系将被安装或者更新。

5:Composer的自动加载

       对于composer的基本操作,很简单,没什么太大的问题,下面的我们来说一下composer的自动加载功能。我们之前提到过,composer会将第三方的类库下载到项目根目录下面的vendor目录下面,但是我们应该怎么使用这些下载好的类库那,类库可能有很多,我们总不能在项目中,一个一个的require进来吧。我们都知道,PHP的常用框架,都支持自动加载功能,方便我们加载类库,composer也提供了自动加载的功能。我们先说一下,实现的具体步骤,之后再说实现的具体的原理。

       Composer会在项目根目录/vendor生成了一个autoload.php 文件。我们可以在自己的项目中直接引入这个文件,这样就可以得到Composer所提供的自动加载的支持。
       代码如下:require 'vendor/autoload.php';
       比如说我们的项目依赖 monolog类库,我们就可以使用下面的方式来自动的加载这个类库,而不需要我们手动的加载这个类库。
      $log = new Monolog\Logger('name');
      $log->pushHandler(new Monolog\Handler\StreamHandler('app.log',Monolog\Logger::WARNING));
      $log->addWarning('Foo');

      上面就实现了自动加载Monlog类了,很是方便。

      有的时候我们可能需要建立自己的类库,同样也需要的自动加载到项目中去。Composer也提供解决这种需求的功能。我们可以在 composer.json文件中配置autoload 字段中添加属于我们自己的autoloader。
      {
        "autoload": {
                             "psr-4": {"Admin\\": "src/"}
                          }
      }

       然后我们执行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 镜像

       一般情况下,安装包的数据(主要是 zip 文件)一般是从 github.com 上下载的,安装包的元数据是从 packagist.org 上下载的。由于众所周知的原因,国外的网站连接速度很慢,并且随时可能被“墙”甚至“不存在”。Packagist 中国全量镜像所做的就是缓存所有安装包和元数据到国内的机房并通过国内的 CDN 进行加速,这样就不必再去向国外的网站发起请求,从而达到加速 composer install 以及 composer update 的过程,并且更加快速、稳定。因此,即使 packagist.org、github.com 发生故障(主要是连接速度太慢和被墙),我们仍然可以下载、更新安装包。
        镜像使用方法:
            系统全局配置: 即将配置信息添加到 Composer 的全局配置文件 config.json 中。见下面的方法一
           单个项目配置: 将配置信息添加到某个项目的 composer.json 文件中。见下面的方法二
           方法一: 修改 composer 的全局配置文件(推荐方式)
                          打开命令行窗口并执行如下命令: composer config -g repo.packagist composer https://packagist.phpcomposer.com
          方法二: 修改当前项目的 composer.json 配置文件:
                         打开命令行窗口,进入你的项目的根目录(也就是 composer.json 文件所在目录),执行如下命令:composer config repo.packagist composer https://packagist.phpcomposer.com

OK,终于写完了。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值