注意到composer是在最近学习一些github里面的项目时,发现不少都有composer.json,原来这货是为了composer包依赖管理工做而活的。其实它在前几年就出现了,只是那个时候PHP版本5.3之后的版本都慢慢兴起来,也就是命名空间才被引用。那,这货到底能干吗呢?简单来讲就是为你引入一个别人写好的功能包,而且为你作好自动加载,你只须要用php标准命名空间来初始化实例就行。能够看下中文的翻译介绍。php
要理解好composer须要了解其它一些辅助工具,逐一来介绍下。预装好php环境,composer工具,这些得必须弄好的吧?java
curl -sS http://getcomposer.org/installer| php -- --install-dir=/usr/local/php/bin cp /usr/local/php/bin/composer.phar /usr/bin/ composer about # 验证
composer.json声明了包依赖以及声明元素标签,关键的就是require
python
{ "require": { "php": ">=5.3", "huamanshu/xorm": "dev-master" } }
如你所见,require的对象将会映射包的名称(huamanshu/xorm)和包的版本是dev-master。那,composer会拿huamanshu/xorm去哪获得相应的包呢?laravel
依赖包名huamanshu/xorm
会到https://packagist.org去获取包。若是你是包的开发者,那你须要先注册一个帐号,github亦如此,再提交你的包名到列表里去。git
而packagist不是实际源码存储的地方,它只是自动同步github的项目https://github.com/meolu/xorm.gitgithub
开发者建立本身的项目,而后在setting里面配置hooks,填写packagist提供的name、token就能够在提交的时候,自动同步到packagist。json
其中项目中composer.json跟上面用来引入包的composer.json不太同样,主要在autoload
,我范例使用的是PSR-4。composer
{ "name": "huamanshu/xorm", "type": "library", "require": { "php": ">=5.3.0" }, "autoload": { "psr-4": { "xorm\\":"src/xorm" } } }
最新的规范是有5个,简称PSR。curl
如今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
在开始新建的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各类语言的接口。
<?php require __DIR__ . '/vendor/autoload.php'; $go = new xorm\Go(); $go->where(); # class Go's function where
除了packagist包,composer 也有平台的包,这些包是并非由 comoposer 安装,它们是安装在操做系统上的东西,composer 将它们做为虚拟的包,以方便管理。它们包括:PHP 自己,PHP 的扩展,还有一些系统中的库。composer show --platform
便可看到。
composer提供这样一个包依赖管理方式对于PHP这样一个社区兴盛的语言,会相似python、java同样,有大量开发者提供了功能包,须要一个方便的机制来调用,版本更新切换、层级嵌套神马的。文件拷贝、代码复制粘贴的时代早已落伍,或许composer很快能一统江湖。不管是想作统计、日志、ORM等等,composer仓库里找找,几分钟后,轮子都已经装备完毕,就等点火启动,爽不?