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,那这种方式则比较适合。

下载地址: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 require、composer 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的强大不止于此,如果想了解更多可以阅读官方文档,写得也非常通俗易懂。