Open musicode opened 9 years ago
先推荐三个网址,基本知识我懒的说了:
简单的说,composer 是管理依赖的工具,依赖的包统一放在 root/vender 目录下,所以通常框架的目录结构是这样的:
root |- app // php 文件 |- public // 前端静态资源 |- vendor // 依赖的第三方库 |- composer |- autoload.php |- composer.json // composer 配置文件,类似 nodejs 的 package.json
vendor 目录下有一个 autoload.php,这是 composer 的入口文件,所以需要在项目初始化时 require 它。
进入项目根目录,执行 composer init,会开始一段交互式命令,你需要填入包名称(格式为 vendor/name)、描述、作者、依赖的包等信息,填完之后会自动在根目录下生成一个 composer.json 文件。
composer init
说明一下,每个项目都可以认为是一个包,包可以依赖于其他包,在这个开源的世界,总是会用到业界的良心包。
当你的项目写的足够通用时,可以发布到 packagist,这样别人也能用了。
这里我们使用 lavarel 框架,因此需要在 composer.json 加入以下配置:
"require": { "laravel/framework": "4.2.*" }
配好依赖之后,执行 composer install,这个过程比较漫长,尤其对国内来说(因为有墙)。
composer install
最好配置一个国内镜像,目前发现有如下两个,一个不行就换另一个:
composer install 耗时比较长,一定要有心理准备,不要出现一点小错就中断它,等它自己结束。
执行完 composer install 之后,项目根目录下会自动创建 vendor 目录。
vendor |- composer |- ClassLoader.php |- autoload_classmap.php |- autoload_namespaces.php |- autoload_psr4.php |- autoload_real.php |- autoload.php
当没有其他第三方依赖时,就是这样的目录结构。如果安装了其他依赖,vendor 目录下会出现相应的文件夹。
下面详细讲解 composer 的加载机制。
Composer 利用 PSR-0 和 PSR-4 以及 PHP5.3 的命名空间构造了一个繁荣的 PHP 生态系统。
Composer 核心方法是 composer/ClassLoader.php 的 findFile(),它的查找顺序是如下:
findFile()
class map 是一个 完全限定类名 -> 文件路径 的映射表。Composer 首先从 class map 中查找类,如果找不到,才会通过 PSR-4 和 PSR-0 查找,所以它的设计初衷应该有两个:
前一章提过 namespace prefix,它会映射到一个或多个目录。
PSR-0 和 PSR-4 关于这部分有细微的不同。如下:
\
如 com/baidu/Search.php,假设 namespace prefix 是 com\baidu\
Composer 为此提供了两个配置文件:
fallback directories 作为 PSR-x 的补充存在。PSR-4 和 PSR-0 各有一个对应的目录数组,当对应的 PSR-x 没有找到时,会从 fallback directories 中进行查找。
通过 composer/include_paths.php 配置路径,Composer 初始化时会通过 set_include_path 把它加入到 include path 的开始位置(优先查找)。
set_include_path
先推荐三个网址,基本知识我懒的说了:
简单的说,composer 是管理依赖的工具,依赖的包统一放在 root/vender 目录下,所以通常框架的目录结构是这样的:
vendor 目录下有一个 autoload.php,这是 composer 的入口文件,所以需要在项目初始化时 require 它。
项目初始化
进入项目根目录,执行
composer init
,会开始一段交互式命令,你需要填入包名称(格式为 vendor/name)、描述、作者、依赖的包等信息,填完之后会自动在根目录下生成一个 composer.json 文件。说明一下,每个项目都可以认为是一个包,包可以依赖于其他包,在这个开源的世界,总是会用到业界的良心包。
当你的项目写的足够通用时,可以发布到 packagist,这样别人也能用了。
这里我们使用 lavarel 框架,因此需要在 composer.json 加入以下配置:
配好依赖之后,执行
composer install
,这个过程比较漫长,尤其对国内来说(因为有墙)。最好配置一个国内镜像,目前发现有如下两个,一个不行就换另一个:
composer install 耗时比较长,一定要有心理准备,不要出现一点小错就中断它,等它自己结束。
vendor 目录结构
执行完 composer install 之后,项目根目录下会自动创建 vendor 目录。
当没有其他第三方依赖时,就是这样的目录结构。如果安装了其他依赖,vendor 目录下会出现相应的文件夹。
下面详细讲解 composer 的加载机制。
Composer 加载机制
Composer 核心方法是 composer/ClassLoader.php 的
findFile()
,它的查找顺序是如下:class map
class map 是一个 完全限定类名 -> 文件路径 的映射表。Composer 首先从 class map 中查找类,如果找不到,才会通过 PSR-4 和 PSR-0 查找,所以它的设计初衷应该有两个:
PSR-x & fallback directories
前一章提过 namespace prefix,它会映射到一个或多个目录。
PSR-0 和 PSR-4 关于这部分有细微的不同。如下:
\
结尾如 com/baidu/Search.php,假设 namespace prefix 是 com\baidu\
Composer 为此提供了两个配置文件:
fallback directories 作为 PSR-x 的补充存在。PSR-4 和 PSR-0 各有一个对应的目录数组,当对应的 PSR-x 没有找到时,会从 fallback directories 中进行查找。
include path
通过 composer/include_paths.php 配置路径,Composer 初始化时会通过
set_include_path
把它加入到 include path 的开始位置(优先查找)。