首页 > 代码库 > composer会成为主流么?

composer会成为主流么?

注意到composer是在最近学习一些github里面的项目时,发现很多都有composer.json,原来这货是为了composer包依赖管理工作而活的。其实它在前几年就出现了,只是那个时候PHP版本5.3以后的版本都慢慢兴起来,也就是命名空间才被引用。那,这货到底能干嘛呢?简单来说就是为你引入一个别人写好的功能包,并且为你做好自动加载,你只需要用php标准命名空间来初始化实例就行。可以看下中文的翻译介绍。

要理解好composer需要了解其它一些辅助工具,逐一来介绍下。预装好php环境,composer工具,这些得必须弄好的吧?

1. composer 安装

curl -sS http://getcomposer.org/installer| php -- --install-dir=/usr/local/php/bin cp /usr/local/php/bin/composer.phar /usr/bin/ composer about # 验证

2. composer.json

composer.json声明了包依赖以及声明元素标签,关键的就是require

{     "require": {         "php": ">=5.3",         "huamanshu/xorm": "dev-master"     } }

如你所见,require的对象将会映射包的名称(huamanshu/xorm)和包的版本是dev-master。那,composer会拿huamanshu/xorm去哪得到相应的包呢?

3. packagist

依赖包名huamanshu/xorm会到https://packagist.org去获取包。如果你是包的开发者,那你需要先注册一个账号,github亦如此,再提交你的包名到列表里去。

而packagist不是实际源码存储的地方,它只是自动同步github的项目https://github.com/meolu/xorm.git

4. github

开发者创建自己的项目,然后在setting里面配置hooks,填写packagist提供的name、token就可以在提交的时候,自动同步到packagist。

其中项目中composer.json跟上面用来引入包的composer.json不太一样,主要在autoload,我范例使用的是PSR-4。

{     "name": "huamanshu/xorm",     "type": "library",     "require": {         "php": ">=5.3.0"     },     "autoload": {         "psr-4": {             "xorm\\":"src/xorm"         }     } }

5. PHP规范标准

最新的规范是有5个,简称PSR。

  • PSR-0 自动加载
  • PSR-1 基本代码规范
  • PSR-2 代码样式
  • PSR-3 日志接口
  • PSR-4 自动加载增强版

现在composer里一般在使用PSR-0、PSR-4,后者是在13年底发布的,但相对前者简洁了很多,看个例子。

Composer使用PSR-0风格

vendor/     vendor_name/         package_name/             src/                 Vendor_Name/                     Package_Name/                         ClassName.php       # Vendor_Name\Package_Name\ClassName             tests/                 Vendor_Name/                     Package_Name/                         ClassNameTest.php   # Vendor_Name\Package_Name\ClassName

Composer使用PSR-4风格

vendor/     vendor_name/         package_name/             src/                 ClassName.php       # Vendor_Name\Package_Name\ClassName             tests/                 ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest

6. 引入包

在开始新建的composer.json初始化下composer install就会生成以下目录。

├── composer.json   ├── composer.lock   ├── test.php  └── vendor       ├── autoload.php       ├── composer       │   ├── autoload_classmap.php       │   ├── autoload_namespaces.php       │   ├── autoload_psr4.php       │   ├── autoload_real.php       │   ├── ClassLoader.php       │   └── installed.json       └── huamanshu           └── xorm               ├── composer.json               ├── README.md               └── src                   └── xorm                       └── Go.php  

github项目xorm会加载到vendor下,并且生成自动加载文件autoload.php。这过程有点类似thrift,根据一个.thrift文件gen各种语言的接口。

7. 使用包

<?php require __DIR__ . ‘/vendor/autoload.php‘; $go = new xorm\Go(); $go->where(); # class Go‘s function where

8. 工程意义

除了packagist包,composer 也有平台的包,这些包是并不是由 comoposer 安装,它们是安装在操作系统上的东西,composer 将它们作为虚拟的包,以方便管理。它们包括:PHP 本身,PHP 的扩展,还有一些系统中的库。composer show --platform即可看到。

composer提供这样一个包依赖管理方式对于PHP这样一个社区兴盛的语言,会类似python、java一样,有大量开发者提供了功能包,需要一个方便的机制来调用,版本更新切换、层级嵌套神马的。文件拷贝、代码复制粘贴的时代早已落伍,或许composer很快能一统江湖。无论是想做统计、日志、ORM等等,composer仓库里找找,几分钟后,轮子都已经装备完毕,就等点火启动,爽不?

composer会成为主流么?