composer:是用来管理依赖的。
1、长久以来,PHP的开源方式都是项目级的,就是说我一开源就是一个项目,比如一整套的CMS,一个框架,如Codeigniter。为啥呢?其中一个很重要的原因是你不好拆开来,如果拆开来的话,没有一个有效的管理工具组合起来,导致拆开的小模块大家无人问津。
然后Composer就出现了,它负责去管理大家开源的各个小模块,有效的整合到一起,使之成为一个完整的项目。
比如说 Laravel 实际上就是由好多的小模块组成的,比如说实现路由模块是由symfony/routing完成的;比如说记日志是由 monolog/monolog 实现的。
当你用 composer 安装 laravel 的时候,composer 会自动检测所需依赖并下载
2、composer 是一个PHP代码依赖管理工具之一
比方说你的项目需要用到PHPmail这个类库,只要按照composer的格式,composer
就能自动帮你拉下这个代码库到你项目中.
3、我的理解:
管理依赖,需要什么组件的时候,使用composer require - 来下载,将在需要的项目目录下自动创建一个vender的目录(每个项目都会生成vender文件夹和两个文件composer.json和composer.lock),里面放置需要的所有组件,该项目如果需要用到这些组件的话,在入口文件中包含上vender的autoload.php自动加载文件
require_once(__DIR__ . '/vender/autoload.php');
这样的话,有这个自动加载文件,就可以在项目中随意new组件。所以composer的作用就是管理某个项目所用到的所有组件,将其整合起来方便使用。
自动加载
如果是组件的话,都会放在vender目录下,所包含的autoload.php会处理,但是如果要自动加载自己项目中的文件的话,方法一是写一个自己的自动加载文件,方法二是在配置文件composer.json改写
1 { 2 "require": { 3 "kiddyu/beanbun": "^1.0", 4 "symfony/finder": "^4.1", 5 "symfony/dom-crawler": "^4.1" 6 }, 7 "repositories": { 8 "packagist": { 9 "type": "composer", 10 "url": "https://packagist.phpcomposer.com" 11 } 12 }, 13 "autoload": { 14 "psr-4": {"Ybean\\": "src"}//意思为定义的Ybean命名空间从目录src下取 15 }, 16 "require-dev": { 17 } 18 }
另外一个配置文件composer.json可供参考
1 { 2 "name": "itititi/tplapidoc", 3 "description": "基于自定义模板,生成你想要的api文档。简单易用且具备可拓展性。", 4 "keywords": ["php", "tplapidoc", "api", "doc"], 5 "type": "library", 6 "license": "MIT", 7 "authors": [ 8 { 9 "name": "peng.yu", 10 "email": "peng.yu@qjfu.cn", 11 "homepage": "https://github.com/itititi", 12 "role": "Developer" 13 } 14 ], 15 "bin": [ 16 "bin/tplapidoc" 17 ], 18 "autoload": { 19 "psr-4": {"TplApidoc\\": "src/"} 20 }, 21 "prefer-stable": true, 22 "require": { 23 }, 24 "require-dev": { 25 "phpunit/phpunit": "@stable" 26 }, 27 "scripts": { 28 "test": [ 29 "phpunit --colors=always" 30 ] 31 } 32 }
所以重要的一行配置即为:
1 "autoload": { 2 "psr-4": {"Ybean\\": "src"}//意思为定义的Ybean命名空间从目录src下取 3 },
有一个思路很牛的入口文件./bin/spider
1 #!/usr/bin/env php 2 <?php 3 $autoload = array_reduce(range(1, 3), function($d, $v) { 4 //$d[] = __DIR__ . '/'.str_repeat('../', $v).'autoload.php'; 5 return $d; 6 }, [__DIR__.'/../vendor/autoload.php']); 7 8 foreach($autoload as $file) { 9 if (file_exists($file)) { 10 define('PHPUNIT_COMPOSER_INSTALL', $file); 11 break; 12 } 13 } 14 15 unset($file); 16 17 if (!defined('PHPUNIT_COMPOSER_INSTALL')) { 18 fwrite( 19 STDERR, 20 'You need to set up the project dependencies using Composer:' . PHP_EOL . PHP_EOL . 21 ' composer install' . PHP_EOL . PHP_EOL . 22 'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL 23 ); 24 die(1); 25 } 26 27 include PHPUNIT_COMPOSER_INSTALL; 28 29 $ybean = new \Ybean\index();
有第一行的#!usr/bin/evn php,这样的话就可以直接这样这行./bin/spider 他会识别直接用PHP来执行