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來執行