概念(是什么)
- Composer 是一个用于 PHP 依赖管理的工具,类似于 JavaScript 的 npm、Python 的 pip。
- 它实现了让你声明项目所依赖的库,并帮你完成安装 / 更新过程。
- 它管理这些包、库是基于项目的,它会安装这些包、库到你项目的一个目录下(一般是在
vendor文件夹里),默认情况下不会全局地安装。 - Composer 要求 PHP 版本在 5.3.2 以上才能运行。
它主要完成两件事:
- 声明项目所依赖的库(包)
- 自动安装/更新这些依赖
运行流程
-
依赖管理原理
-
读取
composer.json,获取依赖列表及版本要求 -
查询 Packagist 仓库
-
计算依赖树,解决版本冲突
-
下载对应依赖到
vendor目录 -
生成自动加载文件
vendor/autoload.php
json文件
- 大体结构
{
"name": "yourname/project-name",
"description": "A short description",
"type": "project",
"require": {
"monolog/monolog": "^2.0"
},
"autoload": {
"psr-4": {
"YourNamespace\": "src/"
}
},
"scripts": {
"post-install-cmd": [
"echo '安装完成'"
]
}
}
- 解析
| 字段 | 说明 |
|---|---|
| require | 依赖库选项 |
| require-dev | 仅用于开发环境的依赖选项 |
| autoload | 自动加载规则,支持 PSR-0/PSR-4(PSR0 已弃用) |
| scripts | 安装/更新时自动执行的脚本 |
| config | 一些自定义配置,如平台版本、优化加载等 |
自动加载
为了描述包的自动加载信息, Composer 会生成一个 vendor/autoload.php 文件,你可以简单的 include 这个文件,并在无需其它额外工作的情况下就可以使用这些包所提供的类
<?php
require_once __DIR__ . '/vendor/autoload.php';
use app\service\PushTaskLoopService;
use app\model\WebPushTaskListModel;
use app\model\WebPushTaskLoopSettingModel;
use app\util\LoopRuleUtil;
// 初始化ThinkPHP应用
$app = new \think\App();
$app->initialize();
加载方式
| 加载方式名称 | 加载机制 | 优势 | 劣势 |
|---|---|---|---|
| PSR-4(推荐) | 遵循 PSR-4 标准的命名空间结构。命名空间到目录的映射(如 App\Model\User → **src/Model/User.php**支持子命名空间自动匹配子目录 | 按需加载,无需扫描全部文件目录结构直接反映命名空间适合中大型项目 | 不适合遗留代码或非命名空间项目 |
| Classmap | 非 PSR 规范的遗留代码,或需要加载大量分散的类文件(公共函数或者助手函数之类)扫描指定目录/文件,生成一个所有类的完整映射表 | 兼容性强:适用于任何类(无论是否命名空间) | 生成慢:每次更新需重新扫描目录(composer dump-autoload) |
| Files(直接加载) | 在每次请求时无条件加载指定文件(类似 require_once)(全局函数、常量之类的辅助文件) | 即时可用:无需考虑类加载顺序 | 性能损耗:无论是否使用都会加载易冲突:全局作用域可能引发命名污染 |
版本控制规则
| 名称 | 写法 | 含义 | 实际范围 |
|---|---|---|---|
| 通配符(*)范围 | 1.0.* | 匹配 1.0.x | 1.0.0, 1.0.1 |
| 波形符版本范围 (~) | ~1.2 | 最小为 1.2,最大小于 2.0 | >=1.2,<2.0 |
| 脱字符版本范围 (^) | ^1.2 | 允许向上兼容(不突破主版本) | >=1.2,<1.3.0 |
| 连字符范围 (-) | 1.0 - 2.0 | 明确的版本区间 | >=1.0.0 <2.1 |
| 精确版本 | 1.0.2 | 固定版本 | 1.0.2 |
常用命令解析
Composer update
- 使用 update 命令。这将获取最新匹配的版本(根据你的 composer.json 文件)并将新版本更新到 composer.lock 文件。 (这相当于删除 composer.lock 文件并再次运行 install) 。
Composer install
- 当项目中存在 composer.lock 文件时使用 install 命令安装依赖时 composer.lock 都会解析并安装你在 composer.json 中所列出来的依赖,但是 Composer 会严格使用 composer.lock 文件列出来的版本来确保项目中的所有成员所安装的版本都是一致的。
composer require
- 默认安装的是 最新稳定版本 会自动修改
composer.json并下载依赖到vendor目录