composer.json内容详解
以项目中的composer.json为例,参考文档。
- name:composer包名
- type:包的类型,project和library两种
- keywords:关键词,方便别人在安装时通过关键词检索(没试过,好像是找不到包会推荐关键词相关的包)
- description:包描述
- license:许可协议,如果包要发布出去的话可以加个
- require:导入的包名,已经允许安装的版本号,语义化版本
- require-dev:开发环境下导入的包名,已经允许安装的版本号,在composer install使用–no-dev参数后不会安装require-dev中的包
- autoload:自动文件加载配置
- autoload-dev:开发环境下自动加载配置,和require-dev类似,使用–no-dev参数后不会自动加载autoload-dev中的文件
- minimum-stable:按稳定性过滤包的默认值,默认为stable。这里值为dev,因为require中有依赖下面这个包,如果该字段设置为statble,那么这个包将不会被安装。其次,该字段的值有很多,项目过程中没遇到过,这里不做讨论。
- prefer-stable:顾名思义,如果有stable安装包有限安装
- extra:scripts 使用的任意扩展数据。项目过程中未使用,故不做讨论
- repositories:定义包的仓库,比如说上面sonow/so-now-sdk包是在公司私有gitlab仓库中的,需要添加仓库源。其中type为预定义仓库类型,gitlab是其中一种。
- scripts:通过执行composer 标签名执行脚本,比如上方执行composer analyse就会执行脚本进行phpstan代码风格审查
composer.lock 和 composer.json区别
composer.lock也放有包版本管理信息,但是composer.lock存放的是确切的版本信息,而composer.json是推荐的版本信息。
执行composer install时,首先会到composer.lock查询版本信息,如果没有composer.lock,会通过composer.json生成composer.lock。
所以需要把composer.json和composer.lock一并放到项目仓库中。
常用命令
composer init
初始化composer.json文件
composer require xxx/xxx -W
导入依赖包,使用-W的目的是,Also update dependencies of the newly required packages, including those that are root requirements.(原文,chatgpt的解释是,会顺带更新composer.json中的require和require-dev,如果不使用-W,只会更新composer.lock)
composer install
如果有composer.lock则安装composer.lock的依赖,没有就先根据composer.json生成composer.lock,再安装依赖。
composer update
忽略 composer.lock 文件,并根据项目的 composer.json 文件中的依赖关系,检查依赖包的最新版本,并尝试更新到最新版本。
composer dumpautoload -o
自动加载,-o会生成优化文件,优化文件里面装的是namespace到文件路径的映射。如果有优化文件,composer会优先从优化文件中读取,否则只能从文件系统中查找。
其他命令如下:
使用composer require遇到的坑和解决方法
- 报错:Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.
这个原因好像是composer require没有更新composer.json导致的,需要加-W参数更新composer.json依赖。
- 安装php扩展
使用composer安装,一般包名是ext-{php扩展名},如下所示:
自动加载
composer.json中定义autoload字段
- psr-4 表示命名空间符合psr-4规范的话,父命名空间App下的所有命名空间都会被自动加载,psr-4规范文档,使用phpstorm也会进行命名空间规范检查并生成修复建议。
- “App\\”: app/ 表示命名空间为App所在的目录为当前运行目录下的app文件夹
- files 其他自动加载的文件
在命名空间正确的情况下,如果无法自动加载文件,需要使用composer dumpautoload -o
命令。个人认为是优化文件没有更新导致新文件不能自动加载导致的。
需要注意的是,在文件中需要正确导入autoload.php,否则不会自动加载文件。
- 为什么hyperf中不用导入autoload.php文件也能做到自动加载?
在 Hyperf 项目中,文件不需要手动导入 autoload.php 文件,是因为 Hyperf 框架已经自动为项目生成了一个优化过的自动加载器,可以自动加载项目中的类和文件,无需手动导入。