回顾一下composer

发布时间 - 2020-12-02 00:00:00    点击率:

下面由composer教程栏目带大家回顾一下composer,希望对需要的朋友有所帮助!

Composer是PHP社区推荐的依赖管理工具。Composer之于PHP犹如npm之于Node,几乎是做现代化PHP开发的必备技能。本文简要回顾相关概念和Composer用法。

拓展和包

与之相关的概念是框架和库,关于框架和库的区别,可以查看本人之前写的这篇文章

拓展和包是两个非常相近的概念。在PHP世界里,一般可以这样理解和区分两者:拓展(extension)和模块(module)等价,是用C语言写的功能合集;包(package)和库(library)等价,主要是用PHP实现的功能合集;拓展以动态链接库(dll或so)的形式加载,包则是通过require/include方式加载。绝大部分时候,两者混用不会造成理解上的困难。

常见的拓展包括GD、ZIP、XML、MySQLi、OPCache等,常见的包包括PHPMailer、PHPOffice、HTMLPurifier等。

PEAR和PECL

在Composer流行之前,PEAR和PECL是更为PHP开发者所知的两个工具(社区)。PEAR是PHP拓展和应用仓库(PHP Extension and Application Repository)的缩写,官网http://pear.php.net ;PECL是PHP拓展社区库(PHP Extension Community Library)的缩写,官网http://pecl.php.net。

两者的区别可用拓展和包来区分:PECL托管拓展,源代码多为C文件,例如APC、AMPQ等;PEAR托管包,功能用PHP实现,如PHP CodeSniffer、HTTP Request等;PEAR对应pear命令,PECL对应pecl命令,可用这两个命令安装和管理拓展和包(pear的build/pickle子命令也可以编译PECL中的拓展)。两者互为补充,官网以姐妹(sisters)形容两者的关系。

PECL是官方拓展的补充,目前仍处于活跃状态,一些优秀的拓展有成为官方拓展的潜质。韩天峰大神的swoole拓展也托管在PECL中,国内名气非常高。相比之下PEAR已是明日黄花。PEAR2和Pyrus(下一代的PEAR包安装工具,基于PHP5.3+构建,官网http://pear2.php.net)的出现也未能挽救PEAR。PEAR没落伴随着本文主角Composer的兴起。

PEAR的定位是“提供可复用的PHP组件”,以中心化的方式为开发者提供功能包。中心化发布的方式保证了代码的质量,同时带来维护上的不便:通过评审的包才能发布,包过时现象严重。PEAR安装的包是全局的,不能为单独项目安装依赖包,非特权用户不能自行安装依赖包。其他缺点还包括糟糕的依赖管理。随着Github的流行和Composer的出现,包管理进入Composer时代。PEAR已经完成其历史使命,可以安心的去了。

Composer

严格来说,Composer的定位是依赖管理工具而非包管理器。Composer中文网对Composer工作介绍如下:

Composer 将这样为你解决问题:a) 你有一个项目依赖于若干个库。b) 其中一些库依赖于其他库。c) 你声明你所依赖的东西。d) Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)。

PEAR能做的事情,Composer都能做(包括安装PECL拓展),部分还能做得更好。Composer默认把包安装在项目目录下,普通用户就能正常使用(Composer官方建议不要以root身份执行composer命令);鼓励遵循最佳实践(即大名鼎鼎的PSR规范,详情见PHP-FIG官网https://www.php-fig.org),极大的推动PHP社区编码风格的规范化;Composer是去中心化的平台,任何人均可发布代码包;发布包无需评审,包的质量由用户投票决定...作为PEAR的继任者,Composer的表现经受住了社区的考验,并成为事实上的依赖管理标准工具。

Composer目前已经形成庞大的生态,在数量上,Composer的包远超PEAR。由于任何人均可自由发布包且无需评审,Composer生态中的包可能存在代码质量参差不齐、代码风格各异、后门漏洞等隐忧。另外Composer的依赖管理以项目为单位,一台机器上可能多次安装同一个包。但瑕不掩瑜,总体而言,Composer极大的改变了PHP的开发生态,促进了代码交流和社区发展。

Composer用法

Composer为管理的项目的依赖而生,项目中的composer.json文件是其工作的依据。该文件中最重要的部分是require部分,该部分告诉Composer期望安装的包及其版本,例如:

{
    "name": "tlanyan/foo",
    "version": "1.0.0",
    ....
    "require": {
        "php": ">=5.4.0",
        "yiisoft/yii2": ">=2.0.6",
        "yiisoft/yii2-swiftmailer": "*",
        "yiisoft/yii2-redis": ">=2.0.0",
        "smarty/smarty": "zuojiankuohaophpcn =3.1.25",
        "yiisoft/yii2-smarty": ">=2.0.0",
        "phpoffice/phpexcel": ">=1.8.0",
        "tecnickcom/tcpdf": "~6.2.0"
    },
    ....
}

然后运行composer install命令,Composer会自动分析依赖,安装最合适的包到vendor目录下。加-v(-vv, -vvv)选项会打印命令执行过程中的详细信息。安装完毕后,vendor目录下会生成autoload.php文件。在项目的入口文件中包含此文件: require __DIR__ . "/vendor/autoload.php";,接下来便可在项目的任何地方引用依赖包中的接口和类。

install命令,Composer提供了许多其他命令管理依赖。常用的命令场景包括:查找依赖、引入依赖、安装依赖、更新依赖。分别对应的命令是:

  1. composer search: 根据关键字查找依赖包,例如查找本人发布的包:composer search tlanyan。该命令等同于上https://packagist.org进行包查找;
  2. composer require: 引入依赖,声明项目或者全局(global,用户名全局,非系统全局)依赖某个包, 例如声明需要swiftmailer包: composer require [global] "swiftmailer/swiftmailer:dev-master";该命令更新composer.json文件,并默认立即安装依赖(--no-update选项可阻止默认安装);效果等同于编辑composer.json文件,然后执行install命令;
  3. composer install:安装composer.json声明的依赖包,最终安装的依赖包版本可能取决于有无composer.lock文件;
  4. composer update: 更新依赖到最新版本,相当于删除composer.lock文件后执行composer install

以上四条命令涵盖使用Composer的大部分场景。以下是几个常用的辅助命令,与依赖分析相关:

  1. composer info: 查看安装的依赖包信息,与composer show等价;
  2. composer dumpautoload: 加-o选项可导出优化的加载器;
  3. composer why(-not): 查看(不)安装某个包的原因。

总结

从拷贝第三方代码到项目中(1994),到PEAR安装依赖包(1999),再到Composer兴起(2012),PHP社区经历了将近20年的探索。PHP这门古老的语言,也在不断的发展更新,在web领域一直发光发热。Composer作为目前PHP包依赖管理的最佳工具,值得每一位PHP开发人员掌握。


# composer  # php  # c语言  # swoole  # json  # npm  # include  # require  # xml  # mysqli  # 接口  # .net  # github  # http  # https  # 官网  # 加载  # 能做  # 目录下  # 合集  # 之于  # 布包  # 明日黄花  # 几个  # 瑕不掩瑜 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  javascript中对象的定义、使用以及对象和原型链操作小结  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  详解Android——蓝牙技术 带你实现终端间数据传输  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  如何基于云服务器快速搭建网站及云盘系统?  青岛网站建设如何选择本地服务器?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  打造顶配客厅影院,这份100寸电视推荐名单请查收  Python3.6正式版新特性预览  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Android GridView 滑动条设置一直显示状态(推荐)  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  PHP正则匹配日期和时间(时间戳转换)的实例代码  python中快速进行多个字符替换的方法小结  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  canvas 画布在主流浏览器中的尺寸限制详细介绍  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何安全更换建站之星模板并保留数据?  Laravel如何实现模型的全局作用域?(Global Scope示例)  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel怎么在Controller之外的地方验证数据  Mybatis 中的insertOrUpdate操作  如何在阿里云服务器自主搭建网站?  Laravel安装步骤详细教程_Laravel环境搭建指南  JavaScript Ajax实现异步通信  如何快速完成中国万网建站详细流程?  再谈Python中的字符串与字符编码(推荐)  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何在七牛云存储上搭建网站并设置自定义域名?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  *服务器网站为何频现安全漏洞?  Swift中循环语句中的转移语句 break 和 continue  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  JS中对数组元素进行增删改移的方法总结  Laravel如何创建自定义Artisan命令?(代码示例)  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Android自定义控件实现温度旋转按钮效果