Composer
徐文志
什么是 package 管理?
maven
pip
bundler
npm
...
为什么要使用package管理?
理想的 package 管理工具是什么样子的?
容易安装、移除
容易升级
自动依赖管理
...
PHP 也是有 package管理的😀
PHP的包管理历史
1999年, 创建 PEAR
promote the re-use of code that performs common functions
- 没有 "显示" 的依赖管理
- 不支持命名空间
- 定义冗长的package.xml
- PEAR Package过于笨重
- 没有标准的加载规范
pear install phpunit/PHPUnit-3.3.17
2009年, PHP-FIG 前身
PHP Framework Interop Group
PSR-0 : autoload标准
2011年, PEAR2
-
PEAR2 packages 仅支持 PHP5.3+
-
"显示"支持依赖管理
-
所有代码必须在 PEAR2 命名空间下
-
所有的 package 都必须使用 package.xml v2.0
-
autoload 支持 PSR-0
pyrus install phpunit/PHPUnit-3.3.17
2012年,composer 出现
-
composer packages 仅支持 PHP5.3.2+
-
"显示"支持依赖管理
-
语义化版本管理
-
命名空间个性化
-
使用 json 文件管理package依赖等信息
-
autoload 支持 PSR-4
-
支持各种源 (github, svn, private repo)
-
支持global/local模式
-
......
2013年,Laravel4 基于composer
2014年,composer革命
Now,composer install number
2 724 619 565
Composer 就这么火起来了!
Composer 使用
Install Composer
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
Get Package
composer.json
{
"require": {
"guzzlehttp/guzzle": "^6.2"
}
}
require:{}
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.2.*",
"predis/predis": "^1.1",
"filp/whoops": "^2.1",
"maatwebsite/excel": "~2.1.0",
"laravelcollective/bus": "^5.2",
"guzzlehttp/guzzle": "^6.2"
},
Define Package List
require-dev:{}
"require-dev": {
"mockery/mockery": "0.9.*",
"phpunit/phpunit": "~4.0",
},
Define Package List in Development
autoload:{}
"autoload": {
"classmap": [
"database","/home/work/libary/", "Class.php"
],
"psr-4": {
"App\\": "app/"
},
"files" : [
"src/MyLibrary/functions.php"
],
"psr-0" : {
"Zend\\" : "src/"
}
},
PSR-0
require 'vendor/autoload.php';
How to use package?
Composer 依赖管理
语义化版本
X . Y . Z
X : 主版本号(不兼容的API修改)
Y : 次版本号(向下兼容的特性新增)
Z : 修订号(向下兼容的bug修复)
版本号依赖
1.精准的版本 : 1.0.0、 dev-master
2.版本范围 : 1.2.* 、2.* 、~1.2、>=1.2
>=1.2 !!不建议!!
Conflict
开发自己的 package
composer init
autoload style
"autoload" : {
"psr-4" : {
"MConfig\\" : "src/"
}
}
composer install
Development
<?php namespace MConfig;
class MConfig
{
public function bootMConfig()
{
}
}
Commit
$ git init
$ git remote add origin git@github.com:xuwenzhi/mconfig.git
$ git pull origin master
$ touch .gitignore
$ vim .gitignore // 添加vendor目录
$ git add .
$ git commit -m 'Init project.'
$ git push origin master
Publish
Release
Other
autoload optimize
composer dumpautoload -o
30%
composer.lock 不要加入 gitignore
使用 PEAR 包
{
"repositories": [
{
"type": "pear",
"url": "https://pear2.php.net"
}
],
"require": {
"pear-pear2.php.net/PEAR2_Text_Markdown": "*"
}
}
架设私有的 package 站
Q & A
Thanks!
Composer
By xuwenzhi
Composer
- 2,141