在项目中使用composer.json
在项目中使用composer,你须要有一个composer.json文件,此文件的做用主要用来声明包之间的相互关系和其余的一些元素标签。
require 关键字
第一件事情在composer.json就是使用require关键字了,你将告诉composer哪些包是你项目所须要的
{
"require": {
"monolog/monolog": "1.0.*"
}
}
如你所见,require的对象将会映射包的名称( monolog/monolog)和包的版本是1.0.*
包的命名
基本上包的命名是 主名/项目名称( monolog/monolog),主名必须惟一,可是项目也就是咱们的包的名称能够有相同的,例如: igorw/json,和seldaek/json
包的版本
咱们须要使用monolog的版本是1.0.*,他的意思是只要版本是1.0分支便可,例如1.0.0,1.0.2或者1.0.99
版本定义的两种方式:
标准的版本:定义保准的版本包文件,如:1.0.2
必定范围的版本:使用比较符号来定义有效的版本的范围,有效的符号有>, >=, <,<=, !=
通配符:特别的匹配符号*,例如1.0.*就至关于>=1.0,<1.1版本的便可
下一个重要的版本:~符号最好的解释就是,~1.2就至关于>1.2,<2.0,但~1.2.3就至关于>=1.2.3,<1.3版本。
安装包
在项目文件路径下运行
$ composer install
这样子他会自动下载monolog/monolog文件到你的vendor目录下面。
接下来须要说明一件事情就是
composer.lock - 锁定文件
在安装完全部须要的包以后,composer会生成一张标准的包版本的文件在composer.lock文件中。这将锁定全部包的版本。
使用composer.lock(固然是和composer.json一块儿)来控制你的项目的版本
这一点很是的重要,咱们使用install命令来处理的时候,它首先会判断composer.lock文件是否存在,若是存在,将会下载相对应的版本(不会在于composer.json里面的配置),这意味着任何下载项目的人都将会获得同样的版本。
若是不存在composer.lock,composer将会经过composer.json来读取须要的包和相对的版本,而后建立composer.lock文件
这样子就能够在你的包有新的版本以后,你不会自动更新了,升级到新的版本,使用update命令便可,这样子就能获取最新版本的包而且也更新了你的composer.lock文件。
$ php composer.phar update
或者
$ composer update
Packagist(这应该就是composer,感受有点像python的包,虽然没那么强大,呵呵,有了这种标准之后,之后你们开发网站绝对会很轻松,能够借鉴不少人的代码了,而且更加方便了!)
Packagist是composer的主要仓库,你们能够去看看,composer仓库的基础是包的源码,你能够随意的获取,Packagist的目的建成一个任何人均可以使用的仓库,这就意味着在你的文件中任意的require包了。
关于自动加载
为了方便的加载包文件,Composer自动生成了一个文件 vendor/autoload.php,你能够方便只有的使用它在任何你须要使用的地方
require 'vendor/autoload.php';
这意味着你能够很是很是方便的使用第三方代码了,假设你的项目须要使用monlog,你直接使用吧,他们都已经自动加载了的!
$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');
固然你也能够在composer.json中加载本身的代码:
{
"autoload": {
"psr-0": {"Acme": "src/"}
}
}
composer将会把psr-0注册为Acme的命名空间
你能够定义一个映射经过命名空间到文件目录,src目录是你的根目录,vendor是同一级别的目录,例如一个文件为:src/Acme/Foo.php就包含了Acme\Foo类
当你在增长autoload以后,你必需要从新install来生成vendor/autoload.php文件
在咱们引用此文件的时候,将会返回一个autoloader类的实力,因此你能够把返回的值放入一个变量,而后在增长更多的命名空间,若是在开发环境下这是很是方便的,例如:
$loader = require 'vendor/autoload.php';
$loader->add('Acme\Test', __DIR__);php