徒手解剖composer,简单了解其实现过程

“composer”?,相信不少作PHP工做的对他并不陌生,他是一个针对第三方库管理工具,解决库与库之间的依赖关系等等等,例如一些yii、laravel等框架都搭载着composer来方便管理第三方包和自身的包,总之他是一个很牛逼的库。牛逼在哪儿,为何牛逼,且先不去谈。php

 

来看看官网,https://getcomposer.org/(外文社区)nginx

http://www.phpcomposer.com/(中文镜像),首先能够看到一个很放纵的男人,在肆无忌惮的发挥着本身的灵感去创做东西,绝不为其余杂事担忧(除过肢体,怎么看都感受这我的好难受,在遭罪的样子),这大概是composer所带来的精妙之处。laravel

除此以外,你还能够看到其文档、指南以及基本介绍和下载途径等,关于这个composer的一些发展史,和发展背景及经常使用的以及大概的基本使用流程。git

但我怎么没有看到他的工做原理呢?例如,composer install 、update 这些命令实际作了什么工做呢,她能为个人项目带来哪些便利呢?我该怎么接入他?  含糊不及,没有人知道他在说些什么。程序员

日前,拿到了一个laravel的项目增添一些东西,其中涉及到一个验证码的问题,laravel内置并无验证码的相关库,大多都是经过第三方引入或者是手写的。github

经过搜索获得,有gregwar/captcha相关的库能够进行方便接入验证码,但是网上关于这个库的使用介绍只有composer的使用方式,按理说我就只须要install一下,update一下,引入一下就能够很方便的得以使用,却还要纠结那么久。web

若是你是以上思惟,那么恭喜你,你不太适合作程序员,缺乏了程序员与生俱来癖症,他让你那么作,你就那么作吗?它让你执行shutdown -s 你也执行吗?最起码也是须要将composer的前因后果搞清楚以后再去享受他所带来的便捷之处,否则只会被工具所蒙蔽。apache

按照我以往的习性,是不会给我电脑装一堆本身所不知道其在干些什么事情的软件。都不知道他在干什么,何须安装它浪费那么一大块儿内存呢?固然这句话不是说composer,composer相似于一个插件,只有运行时才会去执行,不会常驻内存。json

咱们继续,关于安装composer,使用composer,网上有不少更专业的文章文档能够供予你们参考。此文只介绍composer的简单工做内容数组

那么,不安装composer,不使用那一堆堆命令就不能引用第三方库了吗?答案是能够的,但对于初探者来讲,可能会处处碰壁。

咱们所须要了解到,composer是安装在PHP之上的,不借助于apache、nginx等web服务器运行,来看看一个命令:

php composer.phar install

由此就能够看出,他是借助于PHP去运行他的一些东西。假设你没有安装PHP或者没有设置PHP路径为全局变量,那么你也是没法进行使用的。

拆解命令获得:

D:\php\php.exe composer.phar install

那么这样也是能够执行的,其就是省去了精准到PHP程序所在目录这个步骤。

那么后面的composer.phar install 到底作了些什么内容,怎么作的呢?

官方是这样解释的,

接着前面的例子,这将会找到 monolog/monolog 的最新版本,并将它下载到 vendor 目录。 这是一个惯例把第三方的代码到一个指定的目录 vendor。若是是 monolog 将会建立 vendor/monolog/monolog 目录。

大概描述清楚了,就是自动去寻找对应版本下载并建立一些目录作以配置,可他是怎么作的呢?

咱们得对php 的参数作以简单了解,简单举例。

#运行PHP代码
php -r "echo 'hello oschina';"

#运行PHP文件
php -f "d:\work\test.php"   #须要在php.ini里配置对应的目录,不然没权限。

#变相一下,能够在本地直接执行远程服务端写好的代码(从服务端脱下来在本地执行)
php -r "eval(file_get_contents("http://www.server.com/test.php"))"

#更加变相一下,如下伪代码
http://server.com/install.php 内容以下

<?php
$version = parseParamGetVersion($_SERVER['QUERY_STRING']);
$rootPath = dirname(__FILE__).'/';
$packArray = getPackByVersion($version)->toArray();

foreach($packArray as $key=>$files){
    $packPath = $rootPath.'verdor/'.$key.'/';
    if(! is_dir($packPath)){
        mkdir($pathPath);
        foreach($files as $filename => $file){
            $fileContent = file_get_contents($file);//获取最新包的内容
            file_put_contents($packPath.$filename);//写入包的内容
        }
    }
}
?>

#那么本地只须要执行,就实际将存在于网上上的某个包最新数据获取而且规范的写到了本地项目中。
php -r "eval('http://server.com/install.php')";
甚至能够将上一条代码保存到install.bat,直接双击运行。

或许有些人看到这里会恍然大悟,原来是这么回事。那么composer的工做方式也是相似,只不过他比较专业规范一些,使用了不少标准,统一代码。

大概了解事后,咱们继续回归问题,解决图形验证码的问题。

幸甚,gregwar/captcha的全部源代码已经在github上公开,连接从官网获取。直接将git上代码下载下来。所获得的是一个关于这个库的实例demo和核心库以及关于composer自动加载的json配置。

咱们将它直接复制到项目目录中,习惯性的将它和其余同类改为一致的小写命名。

以及写入一个简单的demo,居然无耻的报错了。

很显然,错是应当的,由于当前项目加载的时候并不知道已经新增了一个库,就算引用也没有找到地方。

尝试手工修改composer.json,

"psr-4": {
            "App\\": "app/",
            "Gregwar\\Captcha\\": "vendor/captcha/" //增长引用库,路径模仿楼上
        },
"require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.2.*",
        "gregwar/captcha": "dev-master" //当前不是必须的,当前配置时给composer看的,用做版本对比。
        
    },

修改保存了以后依然报错,没有找到对应的类。这时候应该是很操蛋的状况。由于你明明知道,你此时只须要执行 

php composer update

就完事了,可是仍然忍者痛去剖解。

使用手工排除法,一步步echo exit;

报错很明确,找不到那个类,那么咱们只须要找到一些咱们认为应该加载类的地方去调试看是否加载上那个类就能够得以解决。

首先来到vendor目录中的autoload.php,增长调试语句。

当前已经执行到此处了,继续往下。深刻到图中所示的autoload_real.php中去看看。

很明显,咱们能够看到他加载4大类的加载文件。咱们的库在psr4标准中,执行后,发现dump出来的库不包含咱们的库。继续追溯到所在的文件中,autoload_psr4.php。

保持队形,在数组尾部增长本身所须要使用的库配置。

保存后,将其余调试代码屏蔽掉后。再次运行,发现咱们的验证码出来了。

这个过程也就是php composer update 的主要操做。

还有一些其余的命令,最好是自行研究,此文再也不多说。

文前,曾问过一些朋友,不少对这个工具使用都是游刃有余,有的表现的非常了解,但当我问起原理时,他好像并不知道什么。

更明确了解其工做原理,会让本身的工做更有信心,更不会被质疑,最好不要让本身干了些什么事情都不晓得,都在一天瞎折腾,不然有一天本身调试bug的时候遇到奇葩的问题,更是无从入手。

最后推荐到https://getcomposer.org/ composer 官网看看,文档都很全,只不过英文不太好的人阅读起来很比较痛苦,好比说是我。能够经过中文入门后再经过其深刻。

相关文章
相关标签/搜索