[转]使用Composer管理PHP依赖关系
简介
现在软件规模越来越大,PHP项目的开发模式和许多年前已经有了很大变化。记得初学PHP那会儿,boblog是一个很好的例子,几乎可以代表 PHP项目的开发模式。当时PHP 5.x以上的版本刚开始流行,仍然有大量的生产环境使用PHP4.x。由于历史遗留的问题,OOP思想在PHP项目中还不是那么广泛流行。随着 PHP5.3的发布,PHP项目规模的扩大,在其他语言领域大展身手的OOP开发模式也在PHP中崭露头角。
大型项目不可能是从头开始的,使用社区已经提供的资源可以为项目带来很大的便利。然而各自为政的打包方式、依赖关系的处理,导致了很难将两个开源项 目集成到一起。虽然有pear这种PHP官方支持的包管理工具,但是依然没有很好的统一的依赖关系管理的办法。直到Composer的出现。
Composer的依赖关系管理风格,看上去更像Java的Maven。项目编译和打包、依赖关系的解决都可以很轻松的实现。再也不用费神去寻找或者更新第三方库,或者将他们集成到一起。这一切全部都可以交给Composer来完成。
例子
首先来看一个类似于Helloworld的例子,让我们对Composer先有一个感性的认识吧。
如何在一个PHP项目中启用Composer,很简单,只需要在项目根目录中创建一个composer.json文件即可,它包含如下内容:
1 |
{ |
2 |
"require": { |
3 |
"monolog/monolog": "1.2.*" |
4 |
} |
5 |
} |
这样我们便添加了对monolog这个库的引用。没错,就是这样简单。不过,你还需要使用composer来为你更新依赖包,打开你的Shell,切换到项目目录下执行:
1 |
composer install |
这时,Composer便自动从互联网上更新指定依赖的库了。你会发现你的项目文件夹里面多了一个vendor文件夹,那就是依赖库包了。
接下来,你需要在你的系统的公共入口文件中引用自动加载器,以便自动加载类:
1 |
require 'vendor/autoload.php'; |
安装
上面的例子让大家对composer的使用有了一个大概的认识。下面将向大家介绍如何在PHP环境中安装composer。
Unix/Linux/OSX环境
很幸运,利用Unix Like环境安装composer是一件很简单的事情。只需要一行命令:
1 |
curl -sS https://getcomposer.org/installer | php |
此时会为你在当前工作目录安装composer.phar文件,使用php composer.phar即可运行。当然,你可能更想让composer变成像其他一样的Unix命令,很简单,只需要再加一步:
1 |
mv composer.phar /usr/local/bin/composer |
注意,在权限受限的系统上,你可能需要使用sudo命令来提升至管理员账号执行。
这时,你就可以像例子里面那样使用composer了。
Windows环境
Composer官方推荐使用安装包进行安装,据说下载Composer-Setup.exe这个即可用向导模式安装。
关于手工安装的方法,请参考http://getcomposer.org/doc/00-intro.md的介绍吧。
自动加载
为了实现PHP类的随取随用,类的命名空间定义建议遵从一定的规则。这种规则可以是某一项目组约定的。不过为了使得类库统一,PHP-FIG项目指 定了一种PHP命名空间的规范PSR-0,被一些流行PHP项目采用。Composer支持这种规范的类库自动装载器,只需要向 composer.json文件中添加autoload节点即可:
1 |
{ |
2 |
"autoload": { |
3 |
"psr-0": {"Acme\\": "src/"} |
4 |
} |
5 |
} |
关于PSR-0规范,有这么几点重要的要求:
- 命名空间规范参考:\<Vendor Name>\(<Namespace>\)*<Class Name>
- 每个namespace需要一个顶层空间,即vendor name。用来指定在软件包级别上区别。
- 命名空间和PHP文件的路径是一一对应的,最终命名空间分隔符会被转为DIRECTORY_SEPARATOR
- 文件名必须为类名.php
关于这个规范,可以参考http://blog.mosil.biz/2012/08/psr-0-autoloading-standard/这篇文章。有关PSR-0的更多内容,可以参考他们的官方网站:https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
注意,修改了autoload后,要重新使用composer install。
注意:composer默认类库是使用PSR-0规范自动加载的。所以一般无需额外配置。
查找所需类库
composer提供了一个类库的“商店”,在这里,你可以立即找到想要使用的开源类库包,然后把他们添加到你的项目中即可。传送门:https://packagist.org/
打包自己的类库
将自己的类库贡献给大家,首先需要为自己的类库设置打包信息(要首先保证自己的类库是利用composer管理的)。在composer.json文件中设置:
1 |
{ |
2 |
"name": "your-vendor-name/package-name", |
3 |
"require": { |
4 |
"php": ">=5.3.0", |
5 |
"another-vendor/package": "1.*" |
6 |
} |
7 |
} |
然后就可以前去https://packagist.org/提交你的类库了。
关于composer的更多信息,可以参考:
快速入门:http://getcomposer.org/doc/00-intro.md
文档们:http://getcomposer.org/doc/
[转]使用Composer管理PHP依赖关系的更多相关文章
- 使用Composer管理PHP依赖关系
Composer 是PHP中用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你安装这些依赖的库文件. 系统需求: ...
- Prism 文档 第三章 管理组件之间的依赖关系
第3章:管理组件之间的依赖关系 基于Prism库的复合应用程 ...
- 90%的人都不知道的Node.js 依赖关系管理(上)
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/nodejs-dependency-mana ...
- Composer : php依赖管理工具
原始时代 我记得在当时用php的时候还没有composer,只有个pear,但是不好用呀,还不如直接在互联网上到处复制代码了,更快更不容易出错,当时也没有github这么好的社区工具了 总结如下 代码 ...
- Gradle用户指南(章8:依赖关系管理基础)
章8:依赖关系管理基础 本章将介绍一些gradle依赖关系管理的基础 什么是依赖关系管理? 简略的说,依赖管理是由两部分组成的.首先,gradle需要知道你要构建或者运行的项目,以便找到它们.我们将这 ...
- 微服务下 Spring Boot Maven 工程依赖关系管理
单体 Spring Boot Maven 工程 最基本的 pom.xml 包含工程信息.Spring Boot 父工程.属性配置.依赖包.构建插件 <?xml version="1.0 ...
- Prism 4 文档 ---第3章 管理组件间的依赖关系
基于Prism类库的应用程序可能是由多个松耦合的类型和服务组成的复杂应用程序,他们需要根据用户的动作发出内容和接收通知进行互动,由于他们是松耦合的,他们需要一种方式来互动和交流来传递业务功能的需求. ...
- OSGI中的service依赖关系管理
众所周知.对于高动态高可扩展的应用,OSGI是一个很好的平台.可是.也因此添加了复杂性.开发中对service的依赖变得复杂. 这也是service的关系管理成为OSGI中一个很重要的部分,我们来看看 ...
- 90%的人都不知道的Node.js 依赖关系管理(下)
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/node-dependency-manage ...
随机推荐
- J2EE (十) 简洁的JSTL、EL
简介 JSTL(JSP Standard Tag Library ,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库. 由四个定制标记库(core.format.xml 和 sql)和一对通 ...
- Android学习笔记之viewholder
在adapter中通过使用静态内部类(viewholder)缓存组件的引用来防止ListView刷新时重新LayoutInflater跟findViewById从而达到优化的目的.示例如下: @Ove ...
- Python对文件的操作(转)
一.文件对象 我理解的文件对象就是一个接口,通过这个接口对文件进行相关操作. <Python 核心编程>上说的很晦涩,这里没有深刻理解到,希望有人能解释给我听. >>> ...
- CentOS6.7 用户
1.添加普通用户[root@server ~]# useradd chenjiafa //添加一个名为chenjiafa的用户[root@server ~]# passwd chenjiafa ...
- Solr集成IK中文分词器
1.将IKAnalyzer-2012-4x.jar拷贝到example\solr-webapp\webapp\WEB-INF\lib下: 2.在schema.xml文件中添加fieldType: &l ...
- 一小时搞定DIV+CSS布局-固定页面开度布局
本文讲解使用DIV+CSS布局最基本的内容,读完本文你讲会使用DIV+CSS进行简单的页面布局. 转载请标明:http://www.kwstu.com/ArticleView/divcss_20139 ...
- 关于html页面图片自动撑开的问题
如下列代码: <div id="divnr" style="text-align: center; margin: 10px; width:600px;" ...
- [JavaScript] 判断键盘同时按某些键时执行操作。
前言:之前知乎上看到过一个介绍国外炫酷网站的,其中一个敏感网站用同时按住"q.a.p.l" 才能观看视频 放手则立即强制停止 (手动斜眼).这个功能的实际用处,我认为是可以在做一些 ...
- 【Node.js】Event Loop执行顺序详解
本文基于node 0.10.22版本 关于EventLoop是什么,请看阮老师写的什么是EventLoop 本文讲述的是EventLoop中的执行顺序(着重讲setImmediate, setTime ...
- C语言结构体(struct)常见使用方法
基本定义:结构体,通俗讲就像是打包封装,把一些变量有共同特征(比如同属于某一类事物的属性)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 struct stuf ...