博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
composer的配置文件及用法
阅读量:5939 次
发布时间:2019-06-19

本文共 5206 字,大约阅读时间需要 17 分钟。

hot3.png

一、几个概念(命名空间,PSR,Composer,Packagist)

简单来说,命名空间是一种封装事务的方法,就像在文件系统中使用目录结构来管理文件,php5.3以后就开始使用命名空间来优雅的管理代码(类、函数、常量)。PSR是PHP Standards Recommendation的简称,PSR-4规范了如何指定文件路径从而自动加载类定义,同时规范了自动加载文件的位置。Composer只是根据这二者开发了一个代码自动加载器,Composer本质上就是将Github上的代码下载到本地。它基于项目进行管理,默认不会在全局安装任何东西。依赖管理而不是包管理。它有一个配置文件composer.json,在composer.json文件中声明第三方包依赖,composer会去找到并下载安装它们,文件会下载安装到项目下的./vendor目录,同时根据参数生成用于载入第三方软件的autoload文件。

Packagist是Composer主要的一个包信息存储库,包开发者将具体代码托管到Github上,将包信息提交到Packagist上,这样使用者就可以通过Composer去使用。具体来说,Composer根据本地定义的composer.json信息去查询Packagist,Packagist根据Composer.json/Package.json信息解析,最终对应到github仓库,Composer最终下载代码的时候还要依赖于Github仓库上的Composer.json,这里涉及到三种类型的composer.json,含义是不一样的。

Composer和Packagist紧密合作,如果你告诉Composer想要使用 guzzlehttp/guzzle 组件,Composer会从Packagist中获取 guzzlehttp/guzzle 组件,找到这个组件的仓库地址,确定要使用哪个版本,还能找出这个组件的依赖,然后把 guzzlehttp/guzzle 组件及其依赖下载到你的项目中。

此外,Composer会为项目中的所有PHP组件自动生成符合PSR标准的自动加载器,有效地抽象了 依赖管理自动加载

二、三个命令

composer install命令:

  1. composer会根据本地composer.json文件中的配置来安装包,将下载的包放入项目下的vendor目录下(可在composer.json中配置),
  2. 同时将安装时候的包版本信息放入到composer.lock,以便锁定版本.其实在install的时候,假如发现composer.lock版本和目前vendor目录下的代码版本是一致的,则Composer会什么也不做,composer.lock的目的就是让你安心在目前这个版本下工作,而不获取最新版本的包,
  3. Composer还会为项目中的所有PHP组件(需要在composer.json文件中手动定义)自动生成符合PSR标准的自动加载器

composer update命令:下载最新版本的组件并更新 composer.lock

composer require命令:手动安装指定包到项目vendor目录下
composer dump-autoload命令:修改配置文件后重新加载

三、配置文件

1.定义包依赖,安装前需要检查是否已经安装的软件包列表,指定的包会全被安装:

"require": {		"monolog/monolog": "1.0.*",		"php": ">=5.3.12",		"ext-curl": "*",		"ext-gd": "*",		"ext-iconv": "*",		"ext-json": "*",		"ext-mcrypt": "*",		"ext-zlib": "*",		"ext-zip": "*",	}

例如:使用composer require medz/emoji-format命令手动安装指定第三方包,安装成功后会发现require中多了一项"medz/emoji-format": "^1.0"。

这里声明第三方包依赖,composer会去找到并下载安装它们,文件会默认下载安装到项目下的./vendor目录,同时根据参数生成用于载入第三方软件的autoload文件。需要在项目的入口文件中加入:

require_once __DIR__.'/vendor/autoload.php';

引用vendor/autoload.php这个文件也将返回 autoloader 的实例,你可以将包含调用的返回值存储在变量中,并添加更多的命名空间:

$loader = require 'vendor/autoload.php';$loader->add('Acme\\Test\\', __DIR__);

2.也可以在配置文件中指定安装依赖的根目录

    {        "config": {        "vendor-dir": "src/Vendor/"        }    }

3.定义项目中一个从命名空间到目录的映射:

"autoload": {    "psr-4": {"Acme\\": "src/"}}

此时 src 会在你项目的根目录,与 vendor 文件夹同级。例如 src/Foo.php 文件应该包含 Acme\Foo 类。

按照PSR-4的规则,当试图自动加载 "Acme\\Bar\\Baz" 这个class时,会去寻找 "src/Bar/Baz.php" 这个文件,如果它存在则进行加载。注意, "Acme\\"并没有出现在文件路径中,这是与PSR-0不同的一点,如果PSR-0有此配置,那么会去寻找"src/Acme/Bar/Baz.php"这个文件。

最后,psr-4的配置换被转换成namespace为key,dir path为value的Map的形式,写入生成的 vendor/composer/autoload_psr4.php 文件之中,psr-0则会写入到文件vendor/composer/autoload_namespaces.php中。

除了 PSR-4 自动加载,classmap 也是支持的。你可以用 'classmap' 来指定加载自定义的、不遵循 PSR-0/4 规范的类库。指定它们的目录就能够准确搜索到类文件:

"autoload": {	"classmap": ["src/", "lib/", "Something.php"]}

这里的配置最后会将map写入vendor/composer/autoload_classmap.php文件中

如果你想要明确的指定,在每次请求时都要载入某些文件,那么你可以使用 'files':

"autoload": {	"files": ["src/MyLibrary/functions.php"]}

最后它会生成一个array,包含这些配置中指定的files,再写入新生成的vendor/composer/autoload_files.php文件中。

修改了这些配置后,可以使用命令composer dump-autoload,更新composer在内存中维护的命名空间和class文件路径对应关系的字典。

4.一个包本质上就是一个包含东西的目录。通常情况下它存储 PHP 代码,但在理论上它可以是任何东西。包的元数据包括:名称、版本号、dist 和 source,用dist指向已经发行的稳定版本,用source指向源代码仓库。资源库是包的来源,是一个 packages/versions 的列表。可以指定多个资源库,composer会查找所有资源库去找到需要的资源包。资源库的定义仅可用于“root 包”,而在你依赖的包中定义的资源库将不会被加载。

"repositories": [    {		"type": "vcs",		"url": "https://github.com/ywdblog/phpcomposer"	}]

四、完整示例

composer.json

{    "repositories": [        {            "type": "package",            "package": {                "name": "medz/vendor-pack-pinyin",                "version": "dev-master",                "dist": {                    "url": "https://github.com/jifei/Pinyin/archive/master.zip",                    "type": "zip"                },                "autoload": {                    "classmap": ["Pinyin.php"]                }            }        }    ],    "require": {        "php": ">=5.3.12",        "ext-json": "*",        "medz/vendor-pack-pinyin": "@dev",        "medz/emoji-format": "^1.0",        "illuminate/database": "4.1.*"    },    "require-dev": {        "friendsofphp/php-cs-fixer": "^1.11"    },    "config": {        "vendor-dir": "src/Vendor/",        "preferred-install": "dist"    },    "autoload": {        "files": [            "src/functions.inc.php"        ],        "classmap": [            "src/Think.class.php"        ],        "psr-4": {            "TP\\": "src/",            "TP\\Model\\": "src/Models/",        }    },}

入口文件index.php

'; echo 'You must set up the project dependencies, run the following commands:', PHP_EOL, 'curl -sS https://getcomposer.org/installer | php', PHP_EOL, 'php composer.phar install', PHP_EOL ; echo ''; exit;} $loader = include $file;//数据库连接配置$database = [ 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'test', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',];//使用第三方的插件Eloquent orm,使用前需要先初始化use Illuminate\Container\Container; use Illuminate\Database\Capsule\Manager as Capsule;$capsule = new Capsule;// 创建链接$capsule->addConnection($database);// 设置全局静态可访问$capsule->setAsGlobal();// 启动Eloquent$capsule->bootEloquent();/*其它业务代码*/

 

转载于:https://my.oschina.net/codespring/blog/852063

你可能感兴趣的文章
XILINX_zynq_详解(6)
查看>>
计算机网络术语总结4
查看>>
新手小白 python之路 Day3 (string 常用方法)
查看>>
soapUI的简单使用(webservice接口功能测试)
查看>>
框架 Hibernate
查看>>
python-while循环
查看>>
手机端上传图片及java后台接收和ajaxForm提交
查看>>
【MSDN 目录】C#编程指南、C#教程、ASP.NET参考、ASP.NET 4、.NET Framework类库
查看>>
jquery 怎么触发select的change事件
查看>>
angularjs指令(二)
查看>>
(原創) 如何建立一个thread? (OS) (Linux) (C/C++) (C)
查看>>
<气场>读书笔记
查看>>
领域驱动设计,构建简单的新闻系统,20分钟够吗?
查看>>
web安全问题分析与防御总结
查看>>
React 组件通信之 React context
查看>>
ZooKeeper 可视化监控 zkui
查看>>
Linux下通过配置Crontab实现进程守护
查看>>
ios 打包上传Appstore 时报的错误 90101 90149
查看>>
Oracle推出轻量级Java微服务框架Helidon
查看>>
密码概述
查看>>