composer解决了项目的依赖关系,且实现了自动加载。开发人员只需要几个命令行,就能获取其他开发者的包,PHP开发工作因此变得如同堆积木,可以根据业务的需求,快速方便地拆解组合代码。
初识composer
composer的安装步骤,在composr中文社区有详细的说明,点击查看
安装流程
# 下载安装脚本 - composer-setup.php - 到当前目录 $ php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" # 执行安装过程 $ php composer-setup.php # 删除安装脚本 $ php -r "unlink('composer-setup.php');" # 全局安装 $ sudo mv composer.phar /usr/local/bin/composer # 更换为阿里云镜像源 $ composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
安装完成后,查看composer版本
第一次使用
接下来,我们用composer来安装第一个包
以monolog
包为例,这个包可以让开发者很方便地将日记写入到文件、数据库或其他储存介质中。
1、在项目根目录新建composer.json
文件,写入以下内容
{ "require": { "monolog/monolog": "1.2.*" } }
2、执行composer install
指令安装包依赖
3、使用包进行开发
composer已经为我们下载了monolog
包,且生成了autoload.php
自动加载文件
除了在composer.json
中写包的安装信息,还可以通过composer require mustache/mustache
这种方式直接安装
新建monolog.php
文件,内容如下:
<?php require 'vendor/autoload.php'; use Monolog\Logger; use Monolog\Handler\StreamHandler; // 创建日志句柄 $log = new Logger('name'); $log->pushHandler(new StreamHandler('monolog.log', Logger::WARNING)); // 添加log日志 $log->warn('警告日志'); $log->err('错误日志');
运行脚本,生成了monolog.log 日志文件
只需一个配置文件composer.json
,一行指令composer install
,代码中引入autoload.php
,即可完美地使用第三方包。
composer包管理规范
包名称
包名称由作者+项目名称组成。有些包作者名与项目名是相同的,如mustache/mustache
包名称一定要加上作者,避免冲突。
那么,我们怎么根据一个包的项目名去获取包的信息呢?以
mustache
包为例:
1、在packagist查找
2、用composer search查找
查看包的具体信息
composer show mustache/mustache --all
包版本
在composer.json
中声明安装包时,需要指定包的版本,版本号的指定有多种格式:
1、确定的版本号
格式:1.0.2
最简单的指定方式,无歧义
2、在一定范围的版本号
可以定义多个范围,用逗号隔开,这将被视为一个逻辑AND处理。一个管道符号|将作为逻辑OR处理。 AND 的优先级高于 OR
>=1.0
: 大于或等于1.0版本
>=1.0,<2.0
: 大于或等于1.0,且小于2.0
>=1.0,<1.1|>=1.2
: 大于或等于1.0且等于1.1,或者大于等于1.2
3、通配符
1.0.*
: 只要满足以1.0开头的版本号均可
4、~
下一个重要版本
~1.2 相当于 >=1.2,<2.0
~1.2.3 相当于 >=1.2.3,<1.3
5、^
大于指定的版本
以下用实例演示版本号的区别:
清空根目录,composer.json
内容为:
{ "require": { "mustache/mustache": "2.6.0" } }
执行composer install
指定版本
接下来,删除vendor
目录,将版本号改为~2.6.0
, 执行composer install
此时,会发现版本号并没有变化
这是因为当我们第一次执行
composer install
,会生成composer.lock
文件,这个文件记录了包的指定版本
当我们再次执行composer install
时,composer会先去composer.lock
中检查有没有相应的包信息,如果有,以composer.lock
的版本为准。如果我们要跳过composer.lock
的限制,需要改用composer update
指令
此时,我们看到,版本已经更新为2.6.1
最后再试下将版本号改为^2.6.0
, 执行composer update
此时,已经更新到最新版本号
composer.lock
锁文件
composer.json
在指定版本时,不一定是精确指定,很多时候是使用范围指定,只有当我们安装了包,才知道最终安装了哪个版本。那么问题来了,如果我们半年后再根据composer.json
来安装包,可能有些包的版本已经升级了,且向下不兼容,这就有可能导致程序报错。为避免这种问题,在执行composer install
之后,composer会生成composer.lock
锁文件。
在锁文件中可以看到完整的包信息,包括包的版本号。
composer install
命令会先检查锁文件是否存在,如果存在,它将下载composer.lock
指定的版本(忽略 composer.json
文件中的定义)
如果在composer.json
中修改了版本号,必须执行composer update
命令,这个命令会根据composer.json
的定义安装包,并更新composer.lock
文件
锁文件非常重要!必须将composer.lock
文件上传到代码仓库,这样才能保证团队各成员所安装的包版本是一致的。
创建项目
composer通过create-project
可以直接创建一个完整的项目,将包所在的代码仓库clone下来
以创建laravel项目为例:
composer create-project laravel/laravel Laravel(本地目录名) --prefer-dist(优先选择压缩包,速度更快) "5.5.*"(版本号)
开发与生产环境分开
有些包我们仅需要在本地安装,生产环境并不需要,可以在composer.json
中通过require-dev
进行声明,如:
composer install --no-dev
会忽略require-dev
所声明的包
composer install
会将require-dev
声明的包一并获取
自定义脚本
在Laravel的composer.json
文件中,有这么一段声明:
表示在执行composer install
时的相应阶段,会自动触发运行脚本
发布自己的包
1、github上新建一个仓库
2、创建composer.json文件
在根目录执行composer init, 生成composer.json配置文件
3、在package提交github仓库地址
如果用的是国内的镜像,暂时还不能拉取,需要等国内镜像同步成功后才能拉取