Loading

Composer

xuwenzhi

This is a live streamed presentation. You will automatically follow the presenter and see the slide they're currently on.

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!

Made with Slides.com