php包管理利器composer源码分析1_typesetting的博客-程序员宅基地

long,long ago……PHP程序员似乎不是在copy,就是在copy的路上;经常要实现一些基本功能,比如验证码,分页,树形列表等等,但是又不想自己从头实现,于是百度,大把代码等你拿,仔细挑选一个满意的后,copy大法在自己的工程项目里建个文件夹,整个独立的类文件或者直接放在某个公共函数库文件中,就可以在自己的项目里使用了,但是用的过程中,会遇到各种始料未及的坑,有些甚至在项目上线后才爆发出来,心好累……后来composer出现了,PHP代码管理终于变得清爽,我好你好他好大家好才是真的好。

 基本用法可以参考官网文档,这里想从源码角度分析一下composer的使用。

首先下载源码 https://github.com/composer/composer,clone到本地。

这是源码结构:


注意:源码也是用composer进行代码管理,所以也得先composer install 后才能正常使用;

可以看到有个yml后缀的文件,appveyor是云端持续集成工具。

在vendor文件夹可以看到composer是通过symfony的console组件构建的;

命令入口文件是bin/composer,是个php脚本文件;

先加载了一个启动文件bootstrap.php


假如没有composer install安装,会提示并退出,这个文件返回一个loader;


这里有个xdebug扩展的检测,为了提高composer运行性能,会自动将xdebug关闭并通过passthru命令重启运行,但留了2个参数给用户自行控制:COMPOSER_ALLOW_XDEBUG=1,COMPOSER_DISABLE_XDEBUG_WARN=1。

然后增加memory_limit到1.5G以上,并设置COMPOSER_BINARY;

上面准备工作完毕,就可以运行command application了;


在Application的构造函数中,实例化了NullIO,设置默认的命令是list;


$input表示命令行输入的参数,默认是$_SERVER['argv']:


所以要shift第一个参数,得到tokens


进入doRun主流程


在命令列表中找到input中输入的命令参数名


如果当前目录下找不到composer.json配置文件,提示用户


一路向西,现在到这步了:



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/typesetting/article/details/80278139

智能推荐

什么是ISAPI?_极客行天下的博客-程序员宅基地

  为了成功运行ajax.net,根据网上的资料,我在配置文件中写了这样一些信息: httpHandlers>            remove verb="*" path="*.asmx"/>      add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFa

java学生管理系统界面简单实现<一>_java学生信息管理系统窗口_sunlanchang的博客-程序员宅基地

学生管理系统简单的实现,供初学Java Swing同学学习使用。import java.awt.Dimension;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swin

Nginx 系列学习之——多路IO复用_nginx多路复用_茶叶丨丿氵未的博客-程序员宅基地

ps:最近在学习nginx,为防止一些定义混淆或是遗忘,也是为了方便未来应对相关业务场景时的翻阅,于是特地来csdn上记录一些新学习到的知识技术,以便成长。文章内部或许会引用许多百度上的相关知识内容、博客或百科的文章片段,在下提前在这里对大家说声抱歉....首先介绍下几个定义1、IO多路复用 什么是IO多路复用呢?我们先假设这样一个场景,假设你现在有一个网站,某一天有一大群人突...

Ubuntu系统强制关闭程序_esm-apps_RGiant的博客-程序员宅基地

(1)ctrl+alt+t,调出终端,输入 top,显示的全是现在系统的进程,按占用资源从多到少排列的找到要关掉的进程,记下该进程第一列的PID编号,然后输入q,退回终端(2)输入sudo kill pid即可ctrl+alt+ttopsudo kill 16949 参考链接:https://blog.csdn.net/xifei66/article/details...

Spring MVC的执行流程简述_springmvc的执行流程_某某灬的博客-程序员宅基地

啥都不说,直接上图:1. 用户发起请求到前端控制器(DispatcherServlet),该控制器会过滤出哪些请求可以访问Servlet、哪些不能访问。就是url-pattern的作用,并且会加载springmvc.xml配置文件。2. 前端控制器会找到处理器映射器(HandlerMapping),通过HandlerMapping完成url到controller映射的组件,简单来说,就是...

LaTeX学习之论文中的表格_latex 指定文字引用表格_Wildcraner的博客-程序员宅基地

\begin{table} \caption{shuoming}%表格说明的文字描述部分 \label{TABLE1} %表格名字,用于正文中引用表格 \centering \begin{tabular}{|c| c c c|}% “|”表示表格中的竖线的位置,“\hline”表示表格中横线的位置 \hline \textbf{Method} &amp; \textbf{$&gt;$1px} &amp;\textbf{ $&gt;$3px} &amp;\textbf{ $&

随便推点

Anaconda安装TensorFlow_东篱遁隐的博客-程序员宅基地

下载tensorflow:https://www.anaconda.com/download/ 根据自己需求下载,备注:anaconda里边包含三方计算库和python软件,不用另下载python。 使用Anaconda的conda命令,您可以为单独的Python版本设置虚拟环境,所以不用再纠结你下载到本地的python版本问题,查看官方文本你会发现,Tensor...

ffmpeg 音视频 转换 | 实用命令总结 |_ffmpeg 统一编码_墨理学AI的博客-程序员宅基地

参考博文如下,感谢博主 [文明的博客] 所做工作FFmpeg常用基本命令行推荐 知乎大佬链接(更为详细理解因果) – FFMPEG常用命令下文就是鹅亲测记录的一些实用命令了,欢迎继续查阅不负如来不负卿全局信息首先,可以查看一下 帮助信息,努力看懂一点儿…ffmpeg -h比如:执行:ffmpeg -formats它会返回当前支持的各种音视频类型,部分输出说明如下:... 比如我们看的懂的MP3、MP4 E mp2 MP2 (MPEG a.

C3P0连接MySQL8.0.13遇到的问题_小林子林子的博客-程序员宅基地

自己的MySQL版本是8.0.13,自己写demo的时候一直连接不上,报错,后来查询得知,MySQL8以上的驱动包需要使用新的,不能用之前的老版本的驱动包,同时也要更新C3P0的驱动包我JAR包版本选择的是: C3P0-0.9.5.2.jar mchange-commons-java-0.2.15.jar mysql-connector-java-8.0.11.jarc...

lodash节流函数的使用_lodash 节流函数_明阳mark的博客-程序员宅基地

作用,在一定事件内限制事件的调用,例如我要控制刷屏事件为每秒1次function timeHandler(obj) { var timeHandler = _.throttle(function(e){ console.log("timeHandler", arguments); }, 1000,{ leading: true, tr...

实验六 HBase shell 常用命令_向着太阳,向着光的博客-程序员宅基地

一、熟悉概念1、行键:rowkey,行健没有数据类型,总是视为字节数组 byte[].2、 列族:column family:行里的数据按照列族分组,列族也影响到 hbase 数据的物理存放。因此,它们必须事前定义并且不轻易修改。表中每行拥有相同列族,尽管行不需要在每个列族里存储数据。列族名字是字符串,由可以在文件系统路径里使用的字符组成。3、列限定符(column qualifier):列族里的数据通过列限定符或列来定位。列限定符不必事前定义。列限定符不必在不同行之间保持一致,就像行健一样,列限定符

推荐文章

热门文章

相关标签