Loading deck

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

  • 而 package.xml2.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!