PHP Composer基操

440 阅读4分钟

Composer是PHP中的依赖项管理工具,使用频率非常之高,它允许你声明你项目依赖的库,它会为你**管理(安装/更新)**它们。

一、Composer的安装

1、通过执行安装脚本

# 前提需安装php 
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

上述命令会在当前目录生成一个 composer.phar 文件,这个其实就是composer的执行文件。

2、通过浏览器直接下载

如果你想要下载指定版本的Composer,那这种方式则比较适合。

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d18dfd7013a64493843b6d3a221009a2~tplv-k3u1fbpfcp-zoom-1.image

下载地址:getcomposer.org/download/

注:

第一、第二种方式最终生成的是一个composer.phar文件,你可以将其移动到环境变量对应的目录中,这样就可以全局使用它。

mv composer.phar /usr/local/bin/composer

当然,你也可以执行 php composer.phar 来使用它,这样的好处是你可以指定PHP的版本

3、通过系统的包管理器安装

以Mac为例,Composer还可以通过 brew 进行安装。

# 安装
$ brew install composer

$ composer --version
Composer version 2.2.9 2022-03-15 22:13:37

二、Composer的使用

2.1 composer.json

composer.json 文件是Composer的基石,如果你想要在项目中使用Composer,则必须有一份composer.json 文件。该文件描述项目的依赖关系,也可能包含其他元数据,它通常应该放在项目的最顶层目录中。

一份最简单的 composer.json 文件如下:

{
    "require": {
        "monolog/monolog": "2.0.*"
    }
}

该文件包含三部分内容:

  • require关键字:指定项目需要的依赖
  • monolog/monolog:第三方依赖的名字,第一部分是组织名称(供应商名称),第二部分是项目名称
  • "2.0.*":指定依赖的版本

composer.json 应该纳入版本管理

2.2 composer.lock

有了 composer.json文件,我们就可以利用Composer来安装依赖,在安装完毕后,都会生成一份composer.lock 文件(或者更新它)。composer.lock 文件的作用是锁定PHP依赖的版本,从而保证每个人安装的依赖都是一致的

这份文件在初始化项目非常重要,假设开发A新增了几个依赖,但是依赖的版本并没有指定,只精确到子版本号,类似 "monolog/monolog": "2.3.*",则有可能开发A下载的是2.3.3版本,但是到了开发B下载的就是2.3.4版本,虽然两个版本都归属于同一个小版本下,但没有人能保证这2.3.4是完全兼容2.3.3的,亦或者2.3.4本身存在Bug,所以依赖版本的一致性非常重要!

仍然以 "monolog/monolog": "2.3.*" 为例,该子版本下一共有:2.3.0、2.3.1、2.3.2、2.3.3、2.3.4、2.3.5 这几个小版本,我们先指定某个版本,看看composer会不会安装一样的版本。

安装所有依赖的命令是:composer install

测试如下:

# 1、创建测试目录
$ mkdir composer_version && cd composer_version

# 2、新建composer.json
{
    "require": {
        "monolog/monolog": "2.3.3"
    }
}

# 3.更新到指定版本(下载2.3.3)
composer update

# 4.此时删除vendor目录,并使用composer install,可以看到此时安装的版本与composer.lock一致
$ rm -rf vendor

$ composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 2 installs, 0 updates, 0 removals
  - Installing psr/log (1.1.4): Extracting archive
  - Installing monolog/monolog (2.3.3): Extracting archive
Generating autoload files

composer.lock 同样应纳入版本管理

2.3 依赖管理

Composer依赖管理有多种方式,分别是 composer requirecomposer update 以及composer install

2.3.1 composer require

composer require用于安装/更新单个依赖,如果没有指定版本,默认安装最新版本

# 还是以 monolog/monolog 为例,composer.json 内容如下:
{
    "require": {
        "monolog/monolog": "2.3.3"
    }
}

# 虽然 composer.json 指定了版本,但如果require后没有指定版本,仍然会安装最新版本,并更新composer.json
$ composer require monolog/monolog
Using version ^2.7 for monolog/monolog
./composer.json has been updated
Running composer update monolog/monolog
Loading composer repositories with package information
Updating dependencies
Lock file operations: 2 installs, 0 updates, 0 removals
  - Locking monolog/monolog (2.7.0)
  - Locking psr/log (1.1.4)
...

# composer.json 自动更新
$ cat composer.json
{
    "require": {
        "monolog/monolog": "^2.7"
    }
} 

# 此时我们再指定版本,之前的2.7的版本会降级到2.3.3
$ composer require monolog/monolog:2.3.3
./composer.json has been updated
Running composer update monolog/monolog
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Downgrading monolog/monolog (2.7.0 => 2.3.3)
...

composer require 常见参数:

  • --dev: 添加依赖到 require-dev
  • **-dry-run:**模拟命令,但不做任何操作,主要是用于测试
  • --no-update: 只更新 composer.json,但是不更新依赖(不更新vendor下的文件)
  • **--no-install:**只更新 **** composer.json 和 composer.lock,但是不更新依赖(不更新vendor下的文件)
# 再次以 monolog/monolog 为例,composer.json 内容如下:
{
    "require": {
        "monolog/monolog": "2.3.3"
    }
}

# 先 composer update 生成依赖,并将文件纳入版本依赖(此处省略)
$ composer update

# 升级版本,但可以看到只有 composer.json 文件发生了更新
$ composer require monolog/monolog:2.7 --no-update

# 升级版本,但可以看到只有 composer.json 和 composer.lock 文件发生了更新
$ composer require monolog/monolog:2.7 --no-install

2.3.2 composer update

composer update用于安装/更新多个依赖,如果没有指定依赖名称,则会将 composer.json 下的依赖都更新到最新的匹配版本(以 2.3.* 为例,会更新到 2.3.5,并不会更新到2.7)。

# 假设一开始的 composer.json 文件如下
{
    "require": {
        "monolog/monolog": "2.0.0"
    }
}

# 更新指定版本
$ composer update
Loading composer repositories with package information
Updating dependencies
Lock file operations: 2 installs, 0 updates, 0 removals
  - Locking monolog/monolog (2.0.0)
  - Locking psr/log (1.1.4)
...

# 升级,将版本改为 2.3.*
{
    "require": {
        "monolog/monolog": "2.3.*"
    }
}

$ composer update
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Upgrading monolog/monolog (2.0.0 => 2.3.5)
...

# 如果 composer.json 没该依赖,指定了也不会更新,和 require不同
$ composer update predis/predis
Loading composer repositories with package information
Package "predis/predis" listed for update is not locked.
Updating dependencies
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove

注:如果依赖A没有在 composer.lock 文件出现过,并且指定更新依赖B,则依赖A同样会被下载,如果存在则不会。

2.3.2 composer install

该命令会读取 composer.json 下的依赖,并解决依赖关系,将依赖安装到 vendor 目录,一般初始化项目时使用,有点像前端的 npm install

如果当前目录下有 composer.lock,则会使用该文件下的确切版本,这个在前面也提到过。

写在最后

本文主要讲述的Composer的安装,以及依赖管理中比较常见,也比较容易混淆的三个命令,Composer的强大不止于此,如果想了解更多可以阅读官方文档,写得也非常通俗易懂。

参考

Basic usage - Composer

Libraries - Composer

Command-line interface / Commands - Composer