composer
composer是 PHP 用来管理依赖(dependency)关系的工具。
Java有Maven,Python有pip,Nodejs有npm, 而在composer出现之前,PHP只有被广为诟病的Pear。
composer中文文档:https://learnku.com/docs/composer/2018/03-cli/2084
composer下载安装:
参考链接:https://www.jianshu.com/p/adcae6213e9b
composer.json文件说明:
以下内容为json格式,以下是通过修改composer.json文件+运行命令完成
require对应:composer install
autoload对应:composer dump-autoload
参考链接:https://blog.csdn.net/qq_35655945/article/details/79694249
基本键值对
1 | { |
name:表示包的名称,包名包含两部分,并且以 / 分隔。斜杆前面部分,代表包的所有者,可用Github的用户名作为这部分的值。斜杆后面部分代表包的名称,可以用Github的代码库名称来命名,这种情况下,代码在Github上比较有意义的比较好。(name为键,后面为值)
description:应用简介,这部分尽量简洁介绍下项目,别长篇大论。如果确实有很多话要说,那么可以写在README.md文件里。
keywords:关键词的值是一个字符串数组,在发布成公用库的是时候,作为元数据信息,有利于包的搜索和发现。
homepage:主页,可以放你想放的任何页面地址。
license:许可证,如果你决定将包公开发布,那么记得选择一个合适的许可证。这样别的程序员在引用包的时候,通过查看许可证,确保没有法律上的问题。
authors:作者字段,可以包含一个对象数组,也就是说可以提供多个作者信息。
建一个新的 JavaScript 变量,然后将 JSON 格式的数据字符串直接赋值给它:
1 | var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, |
JavaScript 要想访问 programmers 列表的第一个条目的姓氏,只需在 JavaScript 中使用下面这样的代码:people.programmers[0].lastName;(类似于多维数组)
依赖管理require
使用现有的库来实现发送电子邮件等功能,可以使用现有的库来实现这些功能。要获取这些库,最简单的方式是,搜索下这些库,找到下载地址,下载个zip包,然后解压到相应目录下,根据文档引入相应的文件。使用Composer,可以更加自动和优雅地完成这个过程,这就是Composer的依赖管理。
1 | "require": { |
以swiftmailer为例,swiftmailer/swiftmailer 代表的是包名称,5.3.*@dev , 是版本信息。合起来的意思就是说,我们将要开发的应用,依赖于swiftmailer的5.3.版本。
其中:
''表示除了大版本号以外,小版本号和补丁版本号都可以变:1.2.3 代表 1.2.3 <= 版本号 < 2.0.0
5.3.*表示,可以使用5.3.1版本,也可以使用5.3.2版本,composer在获取的时候,将寻找5.3版本下最新的版本。版本号支持一些更加宽泛的约束,比如>=1.0, >=1.0, <2.0,
@dev(稳定性标签)表示可以获取开发版本。通常,开发版本意味非稳定版本,很可能存在bug。稳定性标签可以作用于特定的依赖项,也可以作用于全局。
作用于特定依赖项(@dev的作用):默认情况下,composer只会获取稳定版本,如果这个例子我们不加@dev约束,而5.3.*版本都是开发版本,那么在获取的时候composer就会报错,指出改版本不符合要求。如果确定这个开发版本没有问题,那么就可以通过加@dev ,让Composer获取这个开发版本。
运行Composer包更新命令,看看效果。
1 | composer install |
会在根目录下发现vendor文件夹,里面包含了刚刚我们列出来的两个包文件代码。
1 | "require-dev": { |
有些包依赖只会在开发过程中使用,正式发布的程序不需要这些包。可运行composer install查看效果.
自动加载autoload
file>classmap>psr-0/psr-0 路径都是相对于应用(项目)的根目录
调用PHPExcel库
只要引入vendor目录下的autoload.php文件就可以了,可以在根目录下(public目录),建一个index.php文件,加入以下内容:
1 | include “vendor/autoload.php” |
file
想让composer帮我们自动加载我们自己定义的类的时候
1 | "autoload":{ |
files键对应的值是一个数组,数组元素是文件的路径,路径是相对于应用(项目)的根目录。file通常作为函数库的载入方式(而非类库)
运行:composer dump-autoload 重建自动加载的信息,完成之后就可以在index.php里调用OrderManager类,但一个个加载文件太麻烦,怎么办?
classmap
1 | "classmap":["lib"] |
所有lib目录下的文件进行引入。当程序需要OrderManager类时,compoer的自动加载类通过查找OrderManager类所在的文件,然后再将改文件include进来。因此,这又导致了一个问题,那就是每加一个新类,就需要运行一次composer dump-autoload来创建类到文件到对应关系。怎么办?
PSR0/4加载方式
FIG组织制定的一组PHP相关规范,简称PSR,其中
PSR-0自动加载 (可以不用composer dump-autoload)
PSR-1基本代码规范
PSR-2代码样式
PSR-3日志接口
PSR-4 自动加载
目前就这五个规范,乍一看,PSR-0和PSR-4是重复了,实际上,在功能上确实有所重复。区别在于PSR-4的规范比较干净,去除了兼容PHP 5.3以前版本的内容,有一点PSR-0升级版的感觉。当然,PSR-4也不是要完全替代PSR-0,而是在必要的时候补充PSR-0——当然,如果你愿意,PSR-4也可以替代PSR-0。PSR-4可以和包括PSR-0在内的其他自动加载机制共同使用
1 | "autoload": { |
APP为空间名(类中的namespace),\\
为分隔符,app/是目录。即搜索文件在app/APP目录下
1 | "autoload":{ |
文件搜索是在:lib/SilkLib/ 目录下
composer命令介绍
composer update与composer install
简单点说就是:
update作用于文件composer.json;
install作用于composer.lock精确下载不更新,但没composer.lock时,效果和update一样
参考链接:https://blog.csdn.net/qq_28787211/article/details/79357879
composer update执行时,composer会去读取composer.json中指定的依赖,去分析他们,并且去拉取符合条件最新版本的依赖。然后他将所拉取到的依赖放入vendor目录下,并且把所有拉取的依赖的精确版本号写入composer.lock文件中。
composer install所执行的事情非常类似,只在第一步的时候有差别。当你本地如果已经存在一份composer.lock时,它将会去读取你的composer.lock而非composer.json,并且以此为标准去下载依赖。当你本地没有composer.lock的时候,它所做的事情和composer update其实并没有区别。
所以只要你本地有一份composer.lock,你就可以保证无论过去了多久,你都能拉到相同的依赖。
当你修改了你的依赖关系,不管是新增了依赖,还是修改了依赖的版本,又或者是删除了依赖执行composer install的时,会得到一个警告信息,并且不会有任何变更。因为composer.lock对应的那份依赖会出现哈希字段段,值不一致自然而然就知道发生了变更了,这时用update就行了。
仅仅更新修改的部分,可通过指定白名单来确定要更新的范围:
composer update monolog/monolog仅会更新monolog/monlog这个依赖,别的依赖哪怕有更新也会被忽略
composer dump
相当于调用 composer dump-autoload
composer require
composer require +类库名 将没有的类库写入composer .json
composer remove
composer remove +类库名 删除类库
更多命令看composer中文文档的composer 命令的使用
可以在中国镜像中寻找类库