Composer的安装与使用

很多时候,我们开发PHP用到的第三方函数库和类库都是手动下载然后放至项目指定的文件夹中。项目需要的库已经存在于电脑的本地磁盘中,复制过来就可以使用,但本地没有的话,我们就需要到互联网上下载,很多时候下载的过程并不是那么轻松,比如受到网络的限制,很多第三方库都是放在国外网站托管,下载速度极慢,甚至不科学上网不能下载成功;还有一个就是依赖问题,一个类库可能依赖一个或多个其他的类库,如果我们下载的文件中没有包含被依赖的库是无法直接使用的,而手动解决依赖是一件很头痛的问题,不仅需要找出类库缩需要依赖的其它库,还要一个个下载补全。此时大家可能会想,java有maven、gradle管理依赖,nodejs有npm管理依赖,那么大php难道就没有么?答案是有的!本次要讲的是PHP的依赖管理工具Composer,Composer是 PHP 用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件。

一、安装

在安装Composer之前,需要配置php可执行文件的路径到环境变量PATH中,这样方便全局调用PHP命令行指令。

我使用的Windows操作系统,PHP环境使用了WampServer集成包,本次演示也是Windows环境下。

PHP安装目录

配置环境变量

检查php的环境变量是否配置成功,可以打开命令行输入php -v尝试获取当前php的版本信息。

1
2
3
4
PS C:\Users\sunfl> php -v
PHP 5.6.16 (cli) (built: Nov 25 2015 18:51:26)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

以上获取到了当前php的版本和zend引擎版本,说明环境变量已经配置成功了。

1、下载安装脚本

通过php命令行命令从Composer官网系在安装脚本,下载后的脚本文件在当前目录下。

1
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

2、执行安装脚本

使用php执行安装脚本脚本

1
php composer-setup.php

下载安装脚本与安装

安装完成后,当前目录下会多出一个名为composer.phar的文件,此为php的归档文件,类似于java中的jar包,里面包含了多个php文件。

具体的执行过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PS E:\> cd .\composer\
PS E:\composer> php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
PS E:\composer> ls


目录: E:\composer


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2017/3/28 13:17 305728 composer-setup.php


PS E:\composer> php .\composer-setup.php
All settings correct for using Composer
Downloading...

Composer (version 1.4.1) successfully installed to: E:\composer\composer.phar
Use it: php composer.phar

得到composer.phar文件后,刚才下载的composer-setup.php安装脚本就没用了,可以删除掉。

3、编写执行脚本

下载composer.phar还不能直接使用运行Composer,因为composer.phar需要php解析,为了方便,可以把composer.phar文件放到php的安装目录下(于php.exe同一个目录),然后用php去运行Composer。

composer.phar放入php的安装目录下,然后编写运行脚本,命名为composer.bat,这样我们就可以在命令行下输入composer就可以执行Composer了。

移动composer.phar

具体脚本内容:

1
@php "%~dp0composer.phar" %*

编写执行脚本

编写脚本完毕,打开CMD或者Power Shell输入composer,如果出现以下信息,说明composer安装成功了!

1
2
3
4
5
6
7
8
PS C:\Users\sunfl> composer
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 1.4.1 2017-03-10 09:29:45

4、配置包镜像源

Composer默认下载的依赖包是使用国外站点,在国内下载速度可以说是龟速,不过国内也有一个免费的Composer镜像站https://pkg.phpcomposer.com/,我们可以把Composer的包下载地址移到国内镜像站点来,具体的配置在这个网站也有详细的说明。

在命令行运行以下命令,配置包下载源地址。

1
composer config -g repo.packagist composer https://packagist.phpcomposer.com

好了,现在Composer可以正常地使用了,接下来是测试环节。

二、使用

毕竟Composer不是代码,我就不写伟大的Hello World了-_-,还是用一个单元测试来实践一下Composer。

在这里,我选择比较出名的PHP单元测试库PHPUnit,PHPUnit可以通过Composer来安装到项目中,说先我们要初始化一个空项目。

新建一个项目,文件夹为composer-test,进入项目文件夹,执行composer init来初始化项目的Composer信息。运行命令之后,Composer会以命令行的形式来让开发者填写的项目的相关信息。

一下是一些简单的介绍相关的填写的信息:

  • Package name:项目的包名,格式为:vendor/name,即开发者/项目名字
  • Description:项目简单描述信息
  • Author:项目的作者信息
  • License:项目所采用的证书类型

在结尾Composer会询问是否现在添加包依赖,我这里选择了添加dev(开发)模式下的依赖,只要输入包的名称之后再输入包的版本号即可。

一下是具体的创建流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
PS E:\wamp64\www> mkdir composer-test


目录: E:\wamp64\www


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2017/3/28 13:51 composer-test

PS E:\wamp64\www> cd composer-test
PS E:\wamp64\www\composer-test> composer init


Welcome to the Composer config generator



This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [sunfl/www]: oopsguy/helloworld
Description []: Composer test
Author [oopsguy <474608426@qq.com>, n to skip]: n
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []:
License []: MIT

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]?
Search for a package:
Would you like to define your dev dependencies (require-dev) interactively [yes]?
Search for a package: phpunit/phpunit
Enter the version constraint to require (or leave blank to use the latest version): 5.5.*
Search for a package:

{
"name": "oopsguy/helloworld",
"description": "Composer test",
"require-dev": {
"phpunit/phpunit": "5.5.*"
},
"license": "MIT",
"require": {}
}

Do you confirm generation [yes]? yes
PS E:\wamp64\www\composer-test>

项目初始化完成后,在项目根目录自动生成composer.json,文件的内容描述了项目的基本信息和依赖信息,和NodeJS的package.json差不多。

1
2
3
4
5
6
7
8
9
{
"name": "oopsguy/helloworld",
"description": "Composer test",
"require-dev": {
"phpunit/phpunit": "5.5.*"
},
"license": "MIT",
"require": {}
}

初始化完成需要安装依赖(即下载依赖库),在composer.json所在的目录运行composer install进行安装依赖。

安装完成后完成后,项目文件夹中多个两个个文件:

  • vendor:第三方类库
  • composer.lock:锁文件,指定了项目的依赖版本,保证项目不受composer.json中依赖的版本升级而收到影响,在执行install命令时,composer检测到存在composer.json文件,就按照里面的依赖和版本安装,不受composer.json影响。
1
2
3
4
5
6
7
8
9
10
11
PS E:\wamp64\www\composer-test> ls


目录: E:\wamp64\www\composer-test


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2017/3/28 13:57 vendor
-a---- 2017/3/28 13:54 177 composer.json
-a---- 2017/3/28 13:57 46988 composer.lock

在项目文件夹下,新建一个测试用例类Tester.php,编码如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
use PHPUnit\Framework\TestCase;

require 'vendor/autoload.php';

class Tester extends TestCase
{

public function testEquals()
{
$this->assertEquals(0, 1);
}

public function testCountEquals()
{
$this->assertEquals(2, count(array(1, 2)));
}

}

代码中引入了PHPUnit的测试用例基类,声明了Tester类,包含了两个测试方法,都是简单的断言比较数值。

保存之后,需要使用PHPUnit的命令行命令运行测试用例。

在刚才生成的三个文件中,有一个vendor文件夹,PHPUnit就在其中,其中还有一个bin文件夹,这里放置这可执行脚本。PHPUnit的执行文件PHPUnit.bat就在里边,进入此目录,执行一下命令

1
PS E:\wamp64\www\composer-test\vendor\bin>  .\phpunit.bat ../../Tester

可以得出如下测试结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PS E:\wamp64\www\composer-test\vendor\bin> .\phpunit.bat ../../Tester
PHPUnit 5.5.7 by Sebastian Bergmann and contributors.

F. 2 / 2 (100%)

Time: 124 ms, Memory: 3.50MB

There was 1 failure:

1) Tester::testEquals
Failed asserting that 1 matches expected 0.

E:\wamp64\www\composer-test\Tester.php:11

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.

两个测试,有一个通过,一个失败。

总结

使用Composer来管理PHP的项目让开发者从繁琐的依赖深渊中解脱出来,只需要一个composer.json文件就可以把项目的依赖描述清楚,在共享项目的时候,我们不需要把第三方的类库文件也包含,只需要composer.json描述清楚,其他开发人员可以通过composer install命令来安装全部的依赖包,当然我们也可以把自己的类库上传至Composer依赖托管库上供其他开发者下载使用。