composer php依赖管理工具
![](https://images2015.cnblogs.com/blog/616954/201608/616954-20160807151536497-650636492.png)
#composer是什么
Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。
composer出现之前我们php项目依赖管理大部分都是手动管理,(当然也可能会用到pear,pear是全局安装的)。
#Composer 解决了那些问题
a) 你有一个项目依赖于若干个库。
b) 其中一些库依赖于其他库。
c) 你声明你所依赖的东西。
d) Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)。
![](https://images2015.cnblogs.com/blog/616954/201608/616954-20160807151652106-447535815.png)
#系统要求
windows,linux,osx
php5.3.2+
git,svn,hg (取决于依赖包用的版本控制)
#安装
windows:
设置环境变量,任何目录下可直接用 composer 命令;
*inux
curl -sS https://getcomposer.org/installer | php -- --install-dir=bin
mv composer.phar /usr/local/bin/composer
( composer.phar 是composer的二进制执行程序,是一个phar包 )
MAC
推荐brew安装
brew update
brew tap josegonzalez/homebrew-php
brew tap homebrew/versions
brew install php55-intl
brew install josegonzalez/php/composer
安装完成之后,-v选项查看详情
![](https://images2015.cnblogs.com/blog/616954/201608/616954-20160807151726622-645584523.png)
#使用
composer依赖管理通过 composer.json 文件配置依赖关系。
json结构,最重要的key是 require 定义依赖关系;
{
"require": {
"monolog/monolog": "1.0.*"
}
}
结构是 包名 :版本
包名格式:供应商/包名 这种结构的好处是运行多个人开发相同的包名,通过供应商名称区分
版本:
![](https://images2015.cnblogs.com/blog/616954/201608/616954-20160807151829387-541238096.png)
~1.2 理解 >= 1.2, <2.0 最后一个点后面的可以变 ~1.2.3 >=1.2.3, < 1.3
依赖关系配置好之后: composer install 会安装包到 vendor/包名 目录下 vendor目录推荐放在版本控制外(.gitignore) 如下:
![](https://images2015.cnblogs.com/blog/616954/201608/616954-20160807151913965-225944086.png)
同时会写一个 composer.lock 文件,里面详细记录安装的版本信息,composer.lock 和 composer.json这两个文件必须加入版本控制中,这样别人初始化项目的时候就会读取lock文件安装指定的版本,即使依赖包有新版本发布,降低了部署风险。(install程序首先检查有没有lock文件)
![](https://images2015.cnblogs.com/blog/616954/201608/616954-20160807151938497-500337975.png)
composer install 运行过程:
![](https://images2015.cnblogs.com/blog/616954/201608/616954-20160807151958122-1347399663.png)
由于有墙,这2个站访问不是很稳定,即使能访问到速度也很慢,强烈推荐 composer中国全量镜像 项目composer.json中加入如下配置:
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
}
详细参考官网:http://pkg.phpcomposer.com/
更新依赖包:
php composer.phar update
只跟新一个包
php composer.phar update monolog/monolog [...]
#自动加载
composer为我们做好了自动加载的操作,项目中我们只需要引入即可:
require 'vendor/autoload.php';
也可以定义自己的autoload:
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
}
}
注册一个psr-4的autoload到App的命名空间,App命名空间映射到目录app 和vendor同级,修改autoload后必须重新运行
composer install 以便重新生成autoload.php
composer dumpautoload
# 包
只要一个文件夹里包含 composer.json 它就是一个包,如果定义了一个require这是一个依赖于其他包的包。
项目本身就是一个包 只是没有名字 通过 composer.json 中的 name 来定义
{
"name": "acme/hello-world",
"require": {
"monolog/monolog": "1.0.*"
}
}
#平台软件包
不是由composer安装的包视为平台软件包,如php本身 通过下面命令查看
![](https://images2015.cnblogs.com/blog/616954/201608/616954-20160807152026497-109672517.png)
输出结果中出现的限制都可以用于定义依赖
# 使用composer管理项目
背景:团队里有自己的框架,库。现在需要做一个新项目。这时候可以使用composer管理
步骤一
把公共的框架和库做成一个composer包, push到git上(svn也行)能访问到就行
![](https://images2015.cnblogs.com/blog/616954/201608/616954-20160807152050903-379931710.png)
步骤二
在我们新项目的composer.json中,定义依赖
![](https://images2015.cnblogs.com/blog/616954/201608/616954-20160807152117590-1293346357.png)
步骤三
执行 composer install 这个时候项目依赖就会自动安装。
最终目录结构如下:
![](https://images2015.cnblogs.com/blog/616954/201608/616954-20160807152138684-1035818658.png)
如果打算开源某个公共库,可以发布到 composer的packageist 地址:https://packagist.org/ 提交项目就行;
# yii2 分析
目前主流php框架新版本都开始composer,如 yii2,laravel等;
{
"name": "yiisoft/yii2-app-basic", // 包名称 供应商/项目名 必须
"description": "Yii 2 Basic Project Template", // 包描述 最长一行 对于要发布的包是必须字段
"keywords": ["yii2", "framework", "basic", "project template"], //该包相关的关键词的数组。这些可用于搜索和过滤 可选
"homepage": "http://www.yiiframework.com/", // 该项目网站的 URL 地址 可选
"type": "project", // 包的安装类型,默认为 library 简单复制到vendor中。 project这表示当前包是一个项目,而不是一个库
"license": "BSD-3-Clause", // 许可协议
"support": { // 获取项目支持的向相关信息对象
"issues": "https://github.com/yiisoft/yii2/issues?state=open",
"forum": "http://www.yiiframework.com/forum/",
"wiki": "http://www.yiiframework.com/wiki/",
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
"minimum-stability": "stable", // 这定义了通过稳定性过滤包的默认行为
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": ">=2.0.5",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*"
},
"require-dev": { // 这个列表是为开发或测试等目的,额外列出的依赖
"yiisoft/yii2-codeception": "*",
"yiisoft/yii2-debug": "*",
"yiisoft/yii2-gii": "*",
"yiisoft/yii2-faker": "*"
},
"config": { // 仅用于项目
"process-timeout": 1800 // 处理进程结束时间
},
"scripts": { // Composer 允许你在安装过程中的各个阶段挂接脚本
"post-create-project-cmd": [
"yii\\composer\\Installer::postCreateProject"
]
},
"extra": { // 任意的,供 scripts 使用的额外数据
"yii\\composer\\Installer::postCreateProject": {
"setPermission": [
{
"runtime": "0777",
"web/assets": "0777",
"yii": "0755"
}
],
"generateCookieValidationKey": [
"config/web.php"
]
},
"asset-installer-paths": {
"npm-asset-library": "vendor/npm",
"bower-asset-library": "vendor/bower"
}
}
}
"name": "yiisoft/yii2-app-basic", // 包名称 供应商/项目名 必须
"description": "Yii 2 Basic Project Template", // 包描述 最长一行 对于要发布的包是必须字段
"keywords": ["yii2", "framework", "basic", "project template"], //该包相关的关键词的数组。这些可用于搜索和过滤 可选
"homepage": "http://www.yiiframework.com/", // 该项目网站的 URL 地址 可选
"type": "project", // 包的安装类型,默认为 library 简单复制到vendor中。 project这表示当前包是一个项目,而不是一个库
"license": "BSD-3-Clause", // 许可协议
"support": { // 获取项目支持的向相关信息对象
"issues": "https://github.com/yiisoft/yii2/issues?state=open",
"forum": "http://www.yiiframework.com/forum/",
"wiki": "http://www.yiiframework.com/wiki/",
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
"minimum-stability": "stable", // 这定义了通过稳定性过滤包的默认行为
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": ">=2.0.5",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*"
},
"require-dev": { // 这个列表是为开发或测试等目的,额外列出的依赖
"yiisoft/yii2-codeception": "*",
"yiisoft/yii2-debug": "*",
"yiisoft/yii2-gii": "*",
"yiisoft/yii2-faker": "*"
},
"config": { // 仅用于项目
"process-timeout": 1800 // 处理进程结束时间
},
"scripts": { // Composer 允许你在安装过程中的各个阶段挂接脚本
"post-create-project-cmd": [
"yii\\composer\\Installer::postCreateProject"
]
},
"extra": { // 任意的,供 scripts 使用的额外数据
"yii\\composer\\Installer::postCreateProject": {
"setPermission": [
{
"runtime": "0777",
"web/assets": "0777",
"yii": "0755"
}
],
"generateCookieValidationKey": [
"config/web.php"
]
},
"asset-installer-paths": {
"npm-asset-library": "vendor/npm",
"bower-asset-library": "vendor/bower"
}
}
}
#常用命令
composer init 以交互的方式创建 composer.json
composer install 处理依赖关系,安装到vendor下
composer update 获取最新版本,并更新lock文件
composer search 搜索依赖
composer validate 有效性检查
更多信息参考官方手册。