Composer:PHP 项目包管理

本文由清尘发表于2019-04-21 17:20最后修改于2019-04-28属于技术文档分类

Composer:PHP 包管理

Composer,是用在 PHP 项目上的一个包管理工具,你的项目一定会用到第三方提供的一些库里的功能 … 用 Composer 可以非常好的去管理这些库 .. 或者叫 Package ..

这些 Package 之间相互还存在一些依赖关系,比如你想用一个包提供的功能,但是这个包的功能会依赖其它的包提供的功能,也就是你需要安装所有的这些依赖以后,才能正常使用你需要的功能。Composer 可以帮我们解决这些包的依赖关系,它会自动给我们下载好所有需要的东西 …

Composer 项目的配置文件是 composer.json … 里面可以设置项目的依赖,可能配置自动加载等等 .. 配置好自动加载以后,在项目里你就不需要在每次使用一些功能的时候,手工载入定义这些功能的 php 文件了 …

现在 Laravel ,Drupal 这些框架也都推荐我们使用 Composer 来管理项目。所以 Composer 对于 PHP 开发者来说是必备的工具。

macOS / Linux:安装 Composer

官方网站:https://getcomposer.org/

打开 Download ..

在这个页面上你可以找到安装 Composer 要执行的脚本 … 其实就是去下载一个 phar 文件 … 注意这里出现的方法只适用于 macOS 或者 Linux 操作系统 … 在 Windows 上安装 Composer 会不太一样 ..

下面我在 macOS 系统上演示一下安装 Composer 的方法 … 先复制一下这里的脚本 … 然后打开命令行工具 …

进入到某个地方 … 比如我的桌面上 …

可以先确定一下系统上已经安装好了 php … 并且要包含 php-cli 这个扩展 … 这样你可以在命令行下面执行 php 这个命令 .. 可以试一下 php –help .. 会出现一些帮助信息 ..

再去安装一下 Composer … 把复制的脚本粘贴过来 … 执行一下 ..

这样会给我们下载一个 composer.phar 文件 … 它就是我们要用的 Composer .. 可以使用 php 去执行一下这个文件 .. php composer.phar .. 会出现一些 Composer 的帮助信息 ..

php composer.phar

现在我们可以把这个文件放在系统的环境变量目录的下面 .. 这样我们在任何地方都可以直接使用 composer 命令了 .. 查看这些目录 .. 可以执行一下 echo $PATH

比如我要把它放在 /usr/local/bin 这个目录的下面 ..

echo $PATH
mv composer.phar /usr/local/bin/composer

如果提示权限问题 .. 可以在命令的前面加上 sudo … 用管理员的身份去执行这个移动文件的命令 ..

现在,我们就可以在任何地方使用 composer 了 ..

这个安装 Composer 的方法同样适用于一些 Linux 操作系统 … 比如 CentOS … Ubuntu 等等 …

composer

composer.json:Composer 配置文件

Composer 项目都有个配置文件,叫 composer.json ,这个文件里面描述了项目的名字,简介,还有项目依赖的包 … 需要自动加载的东西等等 ..

你可以手工创建这个文件,也可以使用 composer 命令去创建它 ..

进入项目目录

composer init

如果提示: The Process class relies on proc_open, which is not available on your PHP installation.

在php.ini中,找到disable_functions选项,看看后面是否有proc_open函数被禁用了,如果有的话,去掉即可

这样会用交互的方式创建 composer.json 这个配置文件 .. 这里先问我们这个项目的名字 .. 格式可以是 vendor 斜线 name .. vendor 一般指的就是用户名,团队的名字等等 .. 你自己创建的包都可以有一个统一的 vendor 名 .. 后面的 name 是这个包的名字 ..

Description 是描述 … php demo pacakge by blog.ipsfan.com

Author 是作者 ..

minimum-stability,可以选择最小化的稳定版 .. Composer 在给我们解决项目的依赖的时候,会检查包的稳定性 .. 这里你可以设置一下稳定的档次 .. 可以是 dev,alpha,beta,Rc 或者 stable .. 默认是 stable .. 就是最稳定的版本 ..

Package Type,项目的类型 .. 可以是 library ,库,project,项目 .. metapackage … 还有 composer plugin .. 我这是一个项目 .. 输入 project ..

License .. 可以为我们的项目选择一个许可协议 .. 比如 MIT ..

Define your dependencies .. 定义项目的依赖 .. 项目的依赖会在后面手工去添加 .. 先输入 no ..

又问我们说要不要定义项目的开发依赖 … 也输入一个 no ..

Do you confirm generation,确定要生成吗 .. Yes .. 如果项目做了版本控制 .. 这里还会提示说,要不要在版本控制里忽略 vendor 这个目录 .. Yes ..

Composer 会把为项目安装的依赖,还有自动加载放在这个目录的下面 … 我们不需要对这个目录里的东西做版本控制 .. 因为执行 composer install 以后,composer 会自动去下载需要的依赖,还有生成自动加载 ..

Composer 会根据我们刚才的回答 … 在项目的下面,给我们生成一个 composer.json 文件 ..

自动加载类 — PSR-4

在项目目录下新建一个文件 app/shine/demo/Greeting.php

<?php

class Greeting {
  public function hello(){
    return 'hello';
  }
}

再回到根目录下的index.php

<?php

require 'app/shine/demo/Greeting.php';

$greet = new Greeting();

print $greet->hello();

然后在命令行下面可以测试一下 .. 执行一下 php index.php … 会输出一个 hello .. 这个字符是在 index.php 文件里载入进来的 Greeting.php 文件里定义的 Greeting 这个类里的 hello 这个方法返回的 ..

PSR-4

也就是每次你要在一个文件里使用在其它文件里定义的类,你都需要先把它载入进来 … 这样做会比较麻烦 … 下面我们可以使用 PSR-4 这种方法自动加载需要的类 ..
这套标准要求我们要使用 namespace,也就是命名空间 .. 这个命名空间里要加上类文件的目录结构 ..

修改app/shine/demo/Greeting.php

<?php

namespace App\shine\demo;

class Greeting {
  public function hello(){
    return 'hello';
  }
}

修改一下composer.json增加autoload

......
"require": {},
"autoload":{
    "psr-4":{"App\\":"app/"}
}

在命令行执行一下

composer dump-autoload

会提示 Generating autoload files .. 创建 autoload 文件 ..

回到项目 ..

现在项目的根目录下面会多了一个 vendor 目录 .. 它里面会存放项目的依赖,还有生成的一些 autoload 文件 ..

打开 composer 这个目录 … 找到 autoload_psr4.php … 在这里你会找到刚才我们配置的用 psr4 标准的自动载入 ..

在 vendor 下面,有个 autoload.php .. 我们需要在项目里 require 一下这个 php 文件 …

修改index.php

<?php

// require 'app/shine/demo/Greeting.php';
require 'vendor/autoload.php';

$greet = new App\shine\demo\Greeting();

print $greet->hello();

到命令行去试一下 … 执行一下 php index.php … 会返回一个 hello … 这个字符是 Greeting 类里的 hello 方法返回的 ..

再修改一下 .. 这里我们也可以在文件的上面,用一个 use,指定一下 App\ninghao\demo\Greeting … 这样下面再实例化 Greeting 的时候,就不需要在前面加上它的命名空间了 ..

<?php

// require 'app/shine/demo/Greeting.php';
require 'vendor/autoload.php';
use App\shine\demo\Greeting;

$greet = new Greeting();

print $greet->hello();

安装依赖的包

PHP 社区提供了很多 Package … 我们可以在自己的项目里使用这些 Package 提供的功能 .. 这些包,你可以在 https://packagist.org/ 这个网站上找到 .. 你也可以把自己创建的 Packge 发布到这个网站上

比如搜索一个 monolog 包,如果你想在项目里使用 monolog 这个包的功能,除了要安装这个包以外,你还得把它依赖的这些东西也要安装到项目上 .. composer 可以帮我们做这些事 ..

在项目里用一下这个包 .. 打开命令行 … 在项目所在的目录的下面 .. 用一下 composer require 这个命令 .. 后面加上包的名字 .. monolog/monolog ..

composer require monolog/monolog

composer 会帮我们下载这个包 … 还有它的所有的依赖 ..

注意最后,会输出一个 Writing lock file .. 还有 Generating autoload files ..

再看一下 vendor 目录 .. 刚才下载的 monolog 会在这个目录的下面 … 另外还有 monolog 依赖的其它的东西,也会被放到这个目录的下面 ..

然后打开这个 composer 目录 .. autoload_psr4.php … 你会发现 .. 除了我们自己注册的 App 这个自动加载 .. 现在又多了一个 PSR\\Log .. 还有一个 MonoLog .. 这些应该就是 Composer 根据刚才安装的 Package 给我们又注册的这些自动加载 ..

现在我们在自己的项目里,可以直接使用这些包提供的功能

演示
我们可以去试一下 … 打开 index.php .. 这里我们用一下 Monolog\Logger … 还有 Monolog\Handler\StreamHandler ..
Monolog 是记录日志用的,它可以把日志放到文件,数据库,浏览器,或者各种 Web 服务上 ..
StreamHandler 这个 Handler ,就可以让我们把日志放到文件里保存 ..

<?php

// require 'app/shine/demo/Greeting.php';
require 'vendor/autoload.php';
use App\shine\demo\Greeting;

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$greet = new Greeting();
print $greet->hello();

$log = new Logger('shine');
$log->pushHandler(new StreamHandler('app/log/demo.log',Logger::DEBUG));

$log->info('hello ~ logger.');

保存 … 回到命令行 … 执行一下 php index.php …

再回到项目 .. 在 app/log 下面,会有一个 demo.log ,这个文件里面的东西就是我们用 MonoLog 这个包提供的功能记录的一条日志 …

vendor 这个目录里的东西,Composer 可以根据 composer.json 还有 composer.lock 自动给我们生成 ..

回到命令行 … 可以先删除掉 vendor 这个目录 …

然后执行一下 composer install …

完成以后,你会发现, 刚才删掉的 vendor 目录又回来了 …