安装
curl -sS https://getcomposer.org/installer | php
这个命令使用 curl 下载 composer 的安装脚本,然后使用 php 进行安装,结果会在当前目录生成 composer.phar 文件。这个文件就是 composer 的二进制执行文件。
我们可以将 composer.phar 放到 /usr/local/bin/ 下,这样就可以在任何地方直接使用命令了
mv composer.phar /usr/local/bin/composer
chmod +x /usr/local/bin/composer
也可以按照官网给定的方式进行安装,参见 https://getcomposer.org/download/
常用的命令
1、install
composer install
首先判断是否存在composer.lock文件,如果存在,则直接根据composer.lock文件安装需要的包,如下图
如果不存在composer.lock文件,则根据composer.json文件进行安装,安装完成后生成composer.lock文件,如下图
注意:为了使每个人项目的环境都使用同样的依赖包,所以需要将composer.json和composer.lock文件纳入版本库,大家只需要根据composer.lock文件进行安装就可以了
2、require
composer require monglog/monglog #安装某个包,这里安装的是mongolog
composer require monglog/monglog:1.2.3 #安装指定版本
composer require 安装完成某个库后会将信息写入到composer.json,并同时更新composer.lock
4、update
composer update #更新所有依赖包
composer update monglog/monglog #更新指定的包
composer update 会读取composer.json中的定义的依赖规则,根据规则更新所有的库,并更新composer.lock文件。
注意:强烈建议不要使用composer update 更新所有的包,这样可能会导致无法预料的问题,应该更新具体的包
5、remove
composer remove monglog/monglog #移除某个包
这个不用多讲,会修改composer.json和更新composer.lock
6、search
composer search monglog #搜索依赖包
7、list
composer list #列出可用的命令
会列出上面那些命令,如图(截取了一部分)
compose.lock文件(前面已经提到,可以不看)
前面已经提到 composer.lock 文件的作用。这个文件会列出项目中使用的所有 PHP 组件,以及组件的版本号。
如果 composer.lock 文件存在的话,在使用 install 命令安装的时候,composer 会下载这个文件中列出的具体组件(包括版本),然后安装相应的组件,版本与该文件中指定的版本相同,而不会去下载最新的版本。所以该文件应该被纳入到版本库,让不同的开发人员,不同的环境(开发、测试和线上)都使用相同的组件版本,避免潜在的风险(比如我遇到的坑,thinkphp5.2和thinkphp5.0的目录结构等都发生了很大的改变,导致在不同的环境下安装了不同的版本,项目无法运行)。
composer.json文件
下面是我的 thinkphp5.0 项目的 composer.json 文件,我会解释说明部分字段含义,更多字段说明可以去官网查看 http://docs.phpcomposer.com/04-schema.html
{
"name": "topthink/think",
"description": "the new thinkphp framework",
"type": "project",
"keywords": [
"framework",
"thinkphp",
"ORM"
],
"homepage": "http://thinkphp.cn/",
"license": "Apache-2.0",
"authors": [
{
"name": "liu21st",
"email": "liu21st@gmail.com"
}
],
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
},
"require": {
"php": ">=5.4.0",
"topthink/framework": "5.0.*",
"topthink/think-image": "^1.0",
"topthink/think-mongo": "^1.0",
"topthink/think-migration": "^1.0",
"topthink/think-angular": "^1.0",
"topthink/think-sae": "^1.0",
"topthink/think-worker": "^1.0",
"topthink/think-queue": "^1.0",
"topthink/think-testing": "^1.0",
"ezyang/htmlpurifier": "^4.9",
"aliyuncs/oss-sdk-php": "^2.2",
"jinchun/aliyun-mns": "^1.3"
},
"extra": {
"think-path": "thinkphp"
},
"config": {
"preferred-install": "dist"
}
}
name:这是组件的厂商名和包名,使用 ‘/’ 隔开,这个属性的值会在 packagist 中显示。
description:不用说了,这个是描述。
type:包的安装类型,用来定义安装逻辑。常见的是两种类型是:1、library:这是默认的类型,它会简单的将文件复制到 vendor 目录。2、project:这表示当前包是一个项目,而不是一个库,这时会将文件直接放到当前目录下。
keywords:关键词
homepage:这个组件网站的 url。
require:这个组件列出组件自身依赖的组件。列出了每个依赖的厂商名和包名,以及版本号要求。
自动加载
目前为止,Composer一共支持4种自动加载方式
PSR-0
PSR-4
class-map
直接包含file
1、PSR-4
Composer推荐使用的一种方式,因为它更易使用并能带来更简洁的目录结构。在一个扩展的composer.json里是这样进行配置的:
{
"autoload": {
"psr-4": {
"Foo\\": "src/",
}
}
}
key和value就定义出了namespace以及其对应的目录映射。按照PSR-4的规则,当试图自动加载”Foo\Bar\Baz”类的时候,会去寻找”src/Bar/Baz.php”这个文件,如果它存在则加载,要注意的是此时”Foo\”并不会出现在文件路径中。
而composer.json这样的配置会被Composer转换成namespace与文件目录的MAP形式,并存在vendor/composer/autoload_psr4.php文件中,所以如果你安装的某个扩展自动加载是PSR-4形式,你可以在autoload_psr4.php找到它的真实路径。
PSR-4自动加载器策略:命名空间前缀与文件目录对应。
2、PSR-0
这是一个已经过时的标准,那是在遥远的PHP5.2时代,你我都知道,PHP5.3之后才有了类似namespace这样的高级属性,所以PSR-0更多是考虑<=5.2时代的扩展,于是乎PSR组织用了一个伪namespace的做法。
{
"autoload": {
"psr-0": {
"Foo\\": "src/",
}
}
}
PSR-0使用下划线组织类名。如
new Foo_Baz_Baz()
表示加载文件 src/Baz/Baz.php
3、class-map
{
"autoload": {
"classmap": ["src/", "lib/"]
}
}
这个加载方式比较容易理解,当Composer开始安装扩展的时候,会根据composer.json里的这个 autoload 告诉的方式classmap,来遍历src、lib目录然后将里面的类文件和其路径一一对应,存放到vendor/composer/autoload_classmap.php内。
配置完成后,使用命令 composer dump-autoload 重新生成类名和文件的映射。
4、file
有了上面这些加载方式还不够么? 是的,还会有一些供全局使用的比如帮助等这样函数,那么好吧,我们就讲这些文件直接包含进来好了。
{
"autoload": {
"files": ["src/MyLibrary/functions.php"]
}
}