Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。
composer官方文档
1、composer能做什么?
Composer 将这样为你解决问题:
a) 你有一个项目依赖于若干个库。
b) 其中一些库依赖于其他库。
c) 你声明你所依赖的东西。
d) Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)
2、如何将composer依赖管理应用到已有项目?
按照官方文档的提示安装composer工具,并且使composer命令全局可用。
安装完成后在命令行运行composer,可以查看compoer可用的命令:
vagrant@ant:/vagrant$ composer
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer 1.10.1 2020-03-13 20:34:27
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
--profile Display timing and memory usage information
--no-plugins Whether to disable plugins.
-d, --working-dir=WORKING-DIR If specified, use the given directory as working directory.
--no-cache Prevent use of the cache
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Available commands:
about Shows the short information about Composer.
archive Creates an archive of this composer package.
browse [home] Opens the package's repository URL or homepage in your browser.
check-platform-reqs Check that platform requirements are satisfied.
clear-cache [clearcache|cc] Clears composer's internal package cache.
config Sets config options.
create-project Creates new project from a package into given directory.
depends [why] Shows which packages cause the given package to be installed.
diagnose Diagnoses the system to identify common errors.
dump-autoload [dumpautoload] Dumps the autoloader.
exec Executes a vendored binary/script.
fund Discover how to help fund the maintenance of your dependencies.
global Allows running commands in the global composer dir ($COMPOSER_HOME).
help Displays help for a command
init Creates a basic composer.json file in current directory.
install [i] Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
licenses Shows information about licenses of dependencies.
list Lists commands
outdated Shows a list of installed packages that have updates available, including their latest version.
prohibits [why-not] Shows which packages prevent the given package from being installed.
remove Removes a package from the require or require-dev.
require Adds required packages to your composer.json and installs them.
run-script [run] Runs the scripts defined in composer.json.
search Searches for packages.
show [info] Shows information about packages.
status Shows a list of locally modified packages, for packages installed from source.
suggests Shows package suggestions.
update [u|upgrade] Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file.
validate Validates a composer.json and composer.lock.
之后,我们新建一个项目,创建一个test-project空目录。在test-project目录下创建一个composer.json文件,用来声明我们的项目依赖。
假设我们现在需要一个库来做日志记录,决定使用 monolog来写日志。传统的方法,是去copy一份monolog的代码到我们的项目里,放在某个目录下(如lib目录),然后将类文件require进来。但composer可以自动地为我们做这些事情,为此,我们只需要在composer.json文件中描述项目的依赖关系:
{
"require": {
"monolog/monolog": "1.2.*"
}
}
这里指出我们的项目需要使用 monolog/monolog 包,从 1.2 开始的任何版本。声明之后,进入test-project目录,在命令行运行 composer install 命令安装依赖:
vagrant@aiouniya:/vagrant/test-project$ composer install
No lock file found. Updating dependencies instead of installing from lock file. Use composer update over composer install if you do not have a lock file.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
- Locking monolog/monolog (1.2.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Downloading monolog/monolog (1.2.1)
- Installing monolog/monolog (1.2.1): Extracting archive
3 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
安装命令会创建一个composer.lock文件锁定当前的依赖。并且创建了vendor目录放置依赖的包,后续声明的其他依赖也会安装到这个目录下。
安装好依赖后如何使用代码呢?为了使用monlog包,我们需要引入composer的自动加载器。我们在项目根目录下创建一个index.php文件来测试:
<?php
// 引入composer自动加载器(实际上很多用composer管理的mvc框架,都会在他们的入口文件index.php里引入composer自动加载器)
require 'vendor/autoload.php';
/* 使用monlog记录日志 */
// 将Logger类use进来
use Monolog\Logger;
// StreamHandler
use Monolog\Handler\StreamHandler;
// create a log channel
$log = new Logger('name');
// 在项目目录下创建logs目录,push warning级别的日志handler
$log->pushHandler(new StreamHandler('logs/warning.log', Logger::WARNING));
// 在warning.log日志文件中写一条warn日志
$log->warn('Hello world');
命令行运行 php index.php测试代码,可以看到在logs目录下成功写入一条日志:
通过composer,我们成功将monolog包引入到了我们的新项目。composer还有很多开源的包,如连接redis、MongoDB的包,发送邮件、excel处理的包,这些包都可以在开源的镜像仓库里找到。假设我们的项目还需要excel处理包,那么只需要在项目目录下运行
composer require phpoffice/phpspreadsheet
composer 就会把 phpspreadsheet 包下载下来放到vendor库。使用这些包极大地简化了开发流程,使开发者不必重复造轮子。再次感谢开源的力量!
3、制作自己的composer包
想像这样一个开发流程,实现某一个项目,需要将php开发团队分成业务组和用户组,业务组负责开发业务相关的代码,用户组负责开发用户相关的代码。业务组的代码中需要用到用户组的代码,如获取用户信息、检验用户合法性等。如何更好的组织不同模块的代码呢?一种可行的实践方案是,将用户组开发的代码制作成私有的composer包,仅供内部使用,业务组通过composer.json文件申明项目的依赖,将用户组开发的包引入进来。这里,我们实践下完整的流程。
(1)新建一个git仓库
首先在码云上创建一个仓库teset-composer用来测试,仓库地址:https://gitee.com/delius/test-composer(这个是笔者的仓库,需要测试可以创建自己的仓库) 。
(2) 添加composer.json文件
为了让我们的仓库能够被compser识别为一个包,我们在仓库里添加一个composer.json文件,编辑这个文件添加包信息:
{
"name": "delius/test-composer",
"description" :"our test package",
"type":"library",
"keywords" :["delius", "ldy", "test composer"],
"homepage":"https://gitee.com/delius/test-composer",
"time":"2021-04-30",
"license":"proprietary",
"authors": [
{
"name": "LawrenceLu",
"email": "lawrenceliu@muchenglin.com",
"homepage": "http://www.naderman.de",
"role": "Developer"
},
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"support": {
"email": "support@example.org",
"irc": "irc://irc.freenode.org/composer"
},
"require": {
"php":">=7.2.0",
"ext-redis":">=5.2.0",
"monolog/monolog": "1.2.*",
"phpoffice/phpspreadsheet":"*",
"predis/predis":"~1.1"
},
"autoload": {
"psr-4": {
"Delius\\": "src/"
}
}
}
name定义了我们的包名,这里直接使用我们的仓库名。license设置为proprietary表明这是一个闭源的包。require字段声明了我们的依赖:需要php版本大于等于7.2.0;需要安装redis扩展,且redis扩展的版本大于等于5.2;最后还需要"monolog/monolog": “1.2."、“phpoffice/phpspreadsheet”:"”、“predis/predis”:"~1.1"三个依赖包。只有这些依赖都满足时,composer才能成功安装delius/test-composer,否则将会报错。我们在autoload字段定义自动加载的映射,将Delius命名空间映射到src目录。
完整的定义参考文档:composer架构
(3) 将制作的包引入到项目中
在delius/test-composer仓库添加测试代码:src\Test\Foo.php
为了将delius/test-composer包引入到我们的项目,我们需要修改test-project目录下的composer.json文件:
{
"require": {
"monolog/monolog": "1.2.*",
"delius/test-composer": "dev-master"
},
"repositories": [
{
"type": "vcs",
"url": "git@gitee.com:delius/test-composer.git"
}
]
}
require声明了两个依赖,一个是之前我们在上面测试过的monolog/monolog,另一个是我们刚刚在git仓库创建的包,这里指明包的版本dev-master,对应的是git的master分支。详细的版本定义可以查看文档:https://docs.phpcomposer.com/02-libraries.html
repositories字段声明了包的来源:
默认情况下 composer 只使用 packagist 作为包的资源库。通过指定资源库,你可以从其他地方获取资源包。
Repositories 并不是递归调用的,只能在“Root包”的 composer.json 中定义。附属包中的 composer.json 将被忽略。
支持以下类型的包资源库:
- composer: 一个 composer 类型的资源库,是一个简单的网络服务器(HTTP、FTP、SSH)上的 packages.json 文件,它包含一个 composer.json 对象的列表,有额外的 dist 和/或 source 信息。这个 packages.json 文件是用一个 PHP 流加载的。你可以使用 options 参数来设定额外的流信息。
- vcs: 从 git、svn 和 hg 取得资源。
- pear: 从 pear 获取资源。
- package: 如果你依赖于一个项目,它不提供任何对 composer 的支持,你就可以使用这种类型。你基本上就只需要内联一个 composer.json 对象。
这里指定type为vcs,url是我们的仓库地址。当 Composer 查找资源包时,它会按照顺序进行。默认情况下 Packagist 是最后加入的,因此自定义设置将可以覆盖 Packagist 上的包。
删除test-project目录下原先安装生成的composer.lock文件和vendor目录,重新运行composer insall安装。可以看到delius\test-composer包成功安装到了vendor目录下。可以看到,在我们的项目里并没有声明predis,但是delius/test-composer包声明了需要predis包,所以composer将predis也安装了进来,composer自动为我们解决了依赖关系。
接着我们在test-project/index.php文件里写一段测试代码:
<?php
// 引入composer自动加载器
require 'vendor/autoload.php';
use Delius\Test\Foo;
echo (new Foo)->hello();
命令行测试代码:
vagrant@aiouniya:/vagrant/test-project$ php index.php
hello,Mr.lawrencevagrant@aiouniya:/vagrant/test-project$
成功输出了结果。如果delius/test-composer仓库更新了代码,那么我们只需要在test-project项目下运行composer update命令即可将最新的代码拉下来。
4、 将composer包开源
如果想和世界分享你写的代码,那么可以在packagist注册一个账号,将自己的git地址提交上去,packagist会去仓库里拉取你的代码,然后制作成镜像,这样别人就能在packagist搜索到你的代码了。