博客列表 >PHP 26 composer原理与常用指令(0806thu)

PHP 26 composer原理与常用指令(0806thu)

老黑
老黑原创
2020年08月08日 09:19:52955浏览

主要内容:

  1. composer install
  2. composer update
  3. composer require
  4. composer create-project
    任选一个组件/包安装到项目中,
    安装 laravel框架创建一个项目
  • 按照以上操作了一遍,还需要再加强。
  • 还有安装后的使用方面,也需要了解下。包括laravel的使用,应该后面还会详细展开。

composer 极简教程

[toc]

1. 背景知识

1.1 组件

  • 组件是一组打包的代码,是一系列相关的类/接口/trait
  • 例如:http 请求组件,路由组件,日志,邮件等…
  • 组件具有功能单一,通信简单,方便测试,文档完善的优点
  • Laravel 就是典型的基于组件开发的 PHP 开发框架

1.2 组件查询

  • PHP 组件查询: https://packagist.org
  • 该网站仅提供了组件的基本信息,如运行环境,以及依赖的其它组件
  • 该网站只是提供了组件查询与描述,组件的源代码存储在github

1.3 组件依赖管理

  • 项目开发过程中总免不了产生对第三方组件的依赖与导入
  • 而众多的第三方组件之间又免不了再次产生相互依赖关系,
  • 随着项目复杂度的不断提升,手工管理组件之间的依赖关系将不再适合
  • 此时,需要一个工具,用来描述项目所依赖的组件以及组件之间的依赖关系
  • composer 就是这样一个优秀的项目组件的依赖管理工具
  • 从此,php 项目开发,真正进入到了组件化开发的新时代

2. composer 原理与安装

2.1 composer 原理

compsoer 是使用 php 开发的包依赖管理工具 (php 5.3.2+)

  • composer 依赖 packagist.org 来查询项目所依赖的组件
  • composer 通过二个重要的配置文件(描述文件)来管理组件依赖
  • composer.json: 项目的依赖以及依赖的描述信息(用户创建)
  • composer.lock: 锁定依赖版本, 保持环境一致性(自动创建)
  • 通过composer下载的组件统一保存在vendor目录中

2.2 compsoer 安装

2.2.1 安装指令(Windows/Mac/Linux)

  1. # 从官网下载`composer`安装脚本
  2. php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
  3. # 执行安装脚本
  4. php composer-setup.php
  5. # 删除安装脚本
  6. php -r "unlink('composer-setup.php');"
  7. # o 当然也可以直接下载setup文件,然后通过非命令的方法进行安装。

Windows 环境下有个坑,有可能会因没有 CA 证书(公钥/私钥)而安装失败,解决方案如下:

  • 访问: https://curl.haxx.se/docs/caextract.html,下载cacert.pem证书
  • 将证书移动到 php 运行环境中,如phpstudy_pro目录下面
  • 打开与 php 版本对应的php.ini文件,找到openssl.cafile=配置顶
  • openssl.cafile=D:/phpstudy_pro/cacert.pem
  • 去掉前面的分号;, 重启服务器Apache/Nginx,再次运行指令

2.2.2 composer 命令全局化

根据操作系统不同, 指令与操作步骤也不相同

  • MacOS/Linux:
  1. # macos/linux: 将`composer`命令移动到bin目录中,使之全局可用
  2. sudo mv composer.phar /usr/local/bin/composer
  • Windows:
  1. # 在项目目录下创建`composer.bat`,并输入以下内容
  2. @php "%~dp0composer.phar" %*
  3. # 直接执行`composer.bat`批处理,完成命令全局化

2.2.3 设置中国全量镜像

  1. # 使用中国全量镜像(全局配置),提升组件下载速度
  2. composer config -g repo.packagist composer https://packagist.phpcomposer.com
  3. # 推荐阿里云的`composer`镜像地址
  4. composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

2.2.4 composer 测试与升级

  1. # 安装完成,终端执行`composer`,看到有命令帮助文本则成功
  2. # 查看版本号
  3. composer -V
  4. # 如果不是最新版本,可立刻升级到最新版本
  5. composer selfupdate

3. composer.json

3.1 “包”(packge)的概念

  • 只要当前目录中存在composer.json文件,那么整个目录就是一个”包”,如blog
  • 此时,你开发的项目就是依赖其它组件库的”包”,只不过你的包没有名称而组件有名称罢了
  • 如果你想将项目做为一个”包”进行发布,可以在composer.json中创建name字段
  • 如果你只想当个伸手党, 那么就可以省略name字段,不影响你对依赖包的调用

3.2 文档功能

  • 声明当前项目与依赖组件(包)之间的依赖与依赖之间的关系
  • 可简单的理解为当前项目的composer配置文档
  • 该文档可以手工创建,也可以使用交互式命令创建
  • 该文档中声明的依赖须通过composer install指令加载
  • 声明的所有依赖会自动下载到vendor目录中(目录全自动创建)
  • 安装完成,会自动生成composer.lock锁定依赖包的版本号等信息
  • 锁定依赖包版本号,可使团队中的每一位开发人员都得到相同版本的依赖包

3.3 交互式创建:composer init

以下载Bootstrap组件为例演示:

  1. $ composer init
  2. Welcome to the Composer config generator
  3. # 欢迎使用Composer配置生成器
  4. This command will guide you through creating your composer.json config.
  5. # 该命令将会指导您创建 composer.json 配置文件
  6. Package name (<vendor>/<name>) [zhupeter/tptest]:
  7. # 包名称: 默认为当前登录用户名和目录名二部分组件,中间用目录分隔符分开
  8. Description []: # 安装的描述,可跳过
  9. Author [, n to skip]: # 作者信息,格式必须是,John Smith <john@example.com>
  10. Peter Zhu <peter@qq.com> # 这是我的信息
  11. # 授权等直接忽略
  12. Define your dependencies.
  13. # 定义依赖,这才是关键步骤,也是必填项
  14. # 在安装包之前, 应该先进行搜索,确定该包存在(根据关键字即可)
  15. Would you like to define your dependencies (require) interactively [yes]?
  16. Search for a package: bootstrap
  17. # 这个地方如果不敲入bootstrap的话,一直直接回车,最终就会创建出composer.json文件
  18. # 搜索 "bootstrap"包
  19. Found 15 packages matching bootstrap
  20. [0] twbs/bootstrap
  21. [1] twitter/bootstrap
  22. [2] fortawesome/font-awesome
  23. ...
  24. # 输入安装包对应的序号即可,例如: 0
  25. Enter package # to add, or the complete package name if it is not listed
  26. 0
  27. # 输入包的版本号,直接回车
  28. Enter the version constraint to require (or leave blank to use the latest version):
  29. # 这里提示3.7是正在使用的版本,4.3+是新版本
  30. 3.7.Using version ^4.3 for twbs/bootstrap
  31. Search for a package: Would you like to define your dev dependencies (require-dev) interactively [yes]? *
  32. Please answer yes, y, no, or n.
  33. # 询问是否可以测试版本,回复: n
  34. Would you like to define your dev dependencies (require-dev) interactively [yes]? n
  35. # 下面就是即将生成的: composer.json 文件的内容
  36. {
  37. "name": "zhupeter/tptest",
  38. "require": {
  39. "twbs/bootstrap": "^4.3"
  40. },
  41. "authors": [
  42. {
  43. "name": "Peter Zhu",
  44. "email": "peter@qq.com"
  45. }
  46. ]
  47. }
  48. # 是否确定创建该文件? 回答: 是, 将自动生成"composer.json"
  49. Do you confirm generation [yes]? yes
  50. # 询问是否现在就安装这些依赖包?
  51. # 我想以后通过"composer install"安装,现在不需要,回复: n
  52. Would you like to install dependencies now [yes]? n
  53. # composer.json 依赖配置文件创建成功, 退出ini命令,返回控制台
  54. $

3.4 手工创建

  • 其实composer.json中最重要的就是require字段,其它均可选
  • 一个可能的经典的文档结构:
  1. {
  2. "require": {
  3. "components/jquery": "3.4.*"
  4. }
  5. }

注: composer.lock由 composer 自动创建和维护,用户不必干涉,也没必要理会

3.5 安装依赖:composer install

以上面的composer.json为例,安装jQuery

  1. # 根据composer.json,下载指定的依赖组件库到`vendor`目录中
  2. composer install

  • 当然每个组建安装的命令好像也有差异,主要是require之后的部分。例如composer require yajra/laravel-datatables-oracle,另外一个composer require twbs/bootstrap

指令会自动进行如下操作

  1. 创建vendor目录,并初始化它,创建必要的配置文件与自动加载入口文件
  2. 访问packgister.org网站查询指定的组件,并从github下载到指定目录下面
  3. 创建composer.lock文档,自动锁定下载的依赖组件的版本号

注意: 再次安装并不会重复以上操作,而是直接从缓存中下载

3.6 更新依赖:composer update

如果composer.json中的依赖版本发生变化

  1. {
  2. "require": {
  3. "components/jquery": "3.5.*"
  4. }
  5. }

此时, composer.jsoncomposer.lock中的版本不一致,需要更新lock文档

  1. # 更新compoer.json中的依赖组件,并将新版本依赖写入composer.lock文档
  2. composer update

注: 此时执行composer install无效,除非手工删除composer.lock再执行


4. 声明依赖: require命令

4.1 没有composer.json

  • 自动创建composer.json,并将依赖组件信息写入require字段
  • 自动创建vendor目录,并初始化
  • 自动执行composer install指令安装依赖到vendor指定目录
  • 自动创建composer.lock锁定依赖组件的版本号

4.2 已存在composer.json

  • 将依赖写入composer.jsonrequire字段
  • 执行composer install命令将依赖安装到vendor指定目录中
  • 将依赖版本号写入composer.lock

4.3 演示

composer.json删除后再测试

4.3 总结

  • require命令,相当于安装依赖包的自动批处理操作,非常方便
  • 在工作中, 应该首选require指定安装组件,全自动操作可防止出错
  • https://packagist.org/中的大多数组件,默认采用该方式安装组件

5. 创建项目: create-project

5.1 功能

  • 该命令用于克隆出一个全新的项目,类似git clone
  • 这个项目是基于一个现成的项目的
  • 项目之所有称之为项目,是它有自己vendor,自己的依赖库
  • 该命令用于创建一个全新的项目,而不能在已经的项目中执行它
  • 最典型的就是一些基于组件的开发框架,如Laravel, ThinkPHP

5.2 演示

  1. # 使用默认配置
  2. composer create-project laravel/laravel blog
  3. # 当有可用的包时,从 dist 安装
  4. composer create-project --prefer-dist laravel/laravel blog
  5. # 指定版本
  6. composer create-project --prefer-dist laravel/laravel blog 6.*

6. 更新自动加载器: dump-autoload

  • 当项目(包中)中新增一个类时,必须使用dump-autoload命令更新自动加载器
  • 该类必须是符合PSR-4规范
  • 命令简写dumpautoload

7. composer.lock: 依赖锁定文件

依赖锁定文件, 通常可以简称为: “锁文件”

  • 功能: 将自动锁定该项目所依赖的安装包以及特定版本号

  • 流程:

    • 依赖安装完成后,Composer 将把确定的版本号列表写到composer.lock
    • 如果再次执行install命令时,将首先检查是否存在composer.lock
    • 如果存在composer.lock将下载它指定的版本,自动忽略composer.json
    • 如果不存在composer.lock,将下载composer.json中的定义,并创建锁文件
  • 优点:任何人都可以通过这个composer.lock获得完全一致的开发环境

  • 缺点:如果依赖更新了,将不会获取到该更新,除非使用update命令
  • update命令,将会根据composer.json获取依赖的最新的版本,并将新版本写到锁文件
  • 对于库, 通常不建议提交锁文件

8. 依赖的自动加载

8.1 默认的加载器

  • 对于库的自动加载,Composer 生成一个vendor/autoload.php文件
  • 引入该文件将免费获得自动加载的支持, 更加方便的使用第三方代码库
  • require 'vendor/autoload.php';添加到你的脚本顶部
  1. require 'vendor/autoload.php';
  2. // 假设已通过composer.json安装了monolog/logger依赖
  3. $log = new Monolog\Logger('name');
  4. // 下面就可以直接使用该类中定义的成员了

8.2 添加自定义的加载器

  • composer.jsonautoload字段定义自己的autoloader
  1. {
  2. "autoload": {
  3. "psr-4": {
  4. "app\\": "application"
  5. }
  6. }
  • autoload字段的解释:

    • Composer 将注册一个PSR-4 autoloaderapp命名空间
    • 即注册一个符合PSR-4标准的加载器到app命名空间中
    • 可以定义命名空间到目录的映射: 例如本例: app空间映射到目录application
    • application目录在项目根目录,并且与vendor目录同级
    • 举例: application/model/Staff.php,中定义app\model\Staff
  • 再次运行composer install命令,更新 composer 的加载器vendor/autoloader.php

  • 引用autoload.php将返回加载器实例,通过它还可以添加更多的命名空间
  1. // $loader 是 autoloader 加载器实例对象
  2. $loader = require 'vendor/autoload.php';
  3. // 添加更多的命名空间到Composer的加载器中
  4. $loader->add('think', 'thinkphp/libray/think');

9. 自动诊断: diagnose

  • 如果感觉程序有问题,可用该指令进行分析(仅供参考)
  • composer diagnose
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议