演讲人:by 大泽木小铁@KKBox
composer解决问题的场景:
方便接手项目的新人知道项目依赖于哪些类库(比如xml,log)
其他语言的套件管理系统:
node.js (npm), Ruby(gem), PHP (PEAR -> Pyrus即PEAR2 -> composer)
Comoser的优点:
- 可以针对项目,而非针对整个系统
- 可以检查执行环境
- 套件审核机制方便
- 设定文档编写简单,不需要用xml,而是用JSON
- 不需要用官方的套件库
- 流行
- 仿造npm和gem的依赖管理
- 支持VCS为下载源(SVN/GIT)
└── rootPackage
├── package1
├── package2
│ ├── package4
│ └── package5
└── package3
package说明:
- package一般分为两类: application 和 library
- application package一般是root package,依赖于多个libraries
- library package也可以依赖于多个libraries
安装composer:
curl -sS https://getcomposer.org/installer | php
# 在项目根目录执行
php composer.phar <command>
# 让composer在系统全局可用 (chmod 加执行权限)
sudo mv composer.phar /usr/local/bin/composer
# 获取帮助信息
composer list
composer help <command>
composer show -i 查看目前安装的套件
把项目放到composer来管理:
cd /path/to/project
composer init
于是composer会询问name、description、authors等
name:比如 "开发者名称/package-mame"
description: 比如 "一句话描述"
authors: 比如 "Name <email>", 默认会抓取~/.gitconfig的设置
minimum-stability: 只能用在root package上,比如:
stable(默认)、RC、beta、alpha、dev (排序按稳定性倒序)
license:比如 Apache-2.0, BSD-2-Clause, MIT 等(参考SPDX的identifier),私有的项目用proprietary表示
require: 比如 "开发者名称/package-name": "version" ,指的是依赖于哪些套件所有package 都需要有一个composer.json。所有package 都需要有一个composer.json
require-dev:开发时安装,上线时不装,比如"phpunit/phpunit":">= 3.7.0", 格式同require,只能用在root package。
完毕后会生成一个composer.json文件
版本规则:
- 1.0.1 (明确指定)
- >= 1.0.1, < 2.0 (范围指定)
- 1.0.* (通配符指定)
- ~1.2 等价于 >=1.2, < 2.0 ; ~1.3.1 等价于 >=1.3.1, < 1.4.0 (下一个重要版本)
版本号+稳定度标识:在版本号后面可以加上: @<稳定度>, 比如:1.0.*@beta
稳定度+分支:dev-master
commit号表示:dev-master#2eb0c... 或 1.0.x-dev#2eb0c...
composer install 会先从 composer.json读取内容,然后读取下载的列表,再下载软件包,然后生成composer.lock(锁住目前安装的版本清单),该文件也要传到git里。新人在执行composer install时,就直接读取composer.lock列表里的清单中的套件。
composer update 会更新 composer.lock,它会找符合条件的最新的package。专案负责人才能执行第一次的install,之后的update也由专案负责人执行。(即凡事改动composer.lock文件的操作都由专案负责人执行)其他成员一律使用composer install。
所以,composer.json和composer.lock要commit到VCS里,library的composer.lock不要放到VCS里(因为library通常一直在更新),vendor也不要放。
官方套件库:(http://packagist.org)
-可搜索
-不像PEAR那样需要审核
- 不实际保存代码
composer先从packagist(默认的地方)拉取依赖包的清单,然后根据这份清单到VCS(比如github)拉取源代码。
用命令行搜索依赖包: composer require ,然后会询问搜索什么名称,比如输入phpunit,然后按提示操作
--prefer-source 从VCS下载
--prefer-dist 下载压缩文档(速度会快些)
--dev 安装开发用的套件
--no-update 不直接安装套件
查看平台上的套件:
composer show --platform
php开头 : php平台
ext-开头: 用PECL安装的套件
lib-开头: 系统函数库
可以在composer.json里把这些平台依赖写进去,比如:(需要手动写入)
"require" : {
"php":">= 5.3",
"ext-xdebug":">=2.3.3",
"ext-http": ">= 1.7.6",
"lib-openssl": ">= 0.9.8"
}
基于VCS(git)的composer.json:
{
"require":{
"vendor/私有仓库":"dev-master"
},
"repositories":[
{
"type":"vcs",
"url":"[email protected]:vendor/私有仓库.git"
}
]
}
repositories只能写在root package上,所以即便依赖包里的composer.json定义了repositories,composer也不会去使用。
自动载入: PSR-0,classmap,files 等类型
composer dump-autoload
命名空间和PEAR形式:
namespace格式: Vendor\Package\Class
PEAR格式:Vendor_Package_Class
"Vendor\", "Vendor\Package",
"Vendor_", "Vendor_Package_"