演讲人: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 └── package3package说明:
- 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":"git@bitbucket.org: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_"