composer.json内容详解

以项目中的composer.json为例,参考文档

file

  • 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,那么这个包将不会被安装。其次,该字段的值有很多,项目过程中没遇到过,这里不做讨论。

file

  • 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会优先从优化文件中读取,否则只能从文件系统中查找。

其他命令如下:

file

使用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扩展名},如下所示:

file

自动加载

composer.json中定义autoload字段

file

  • 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 框架已经自动为项目生成了一个优化过的自动加载器,可以自动加载项目中的类和文件,无需手动导入。

Categories:

Tags:

还没发表评论,快来发表第一个评论吧~

发表回复