PHP 之 Composer 新手入门指南

自2012年3月1日发布以来,Composer因提供了PHP迫切需要的东西:依赖项管理而广受欢迎。实际上,Composer是将所有第三方软件(例如CSS框架,jQuery插件等)引入你的项目的一种方法。

我敢肯定,现在有很多编码人员对使用作曲家的好处感到疑惑,并且还有很多人害怕去尝试新的工具。在本文中,我们将会了解 Composer 它到底是什么,它做了什么,为什么它是一个很棒的 PHP 开发工具。

首先,我们将更深入地了解依赖管理,然后安装 Composer。我们将大致了解一下它的基本用法,然后学习一些基础知识。现在我们开始吧!

什么是依赖管理?

  · 依赖性管理实际上是一个非常简单的概念。假设您现在需要创建一个单页的网站,而你的 JavaScript 和 CSS 的需要用到 Foundation 框架。要如何将 Foundation 框架添加到项目中呢?

  · 通常的方法是访问网站,下载软件包并将其放在项目中的某个位置。到目前为止,一切都很好。现在,当你想更新到最新版本时该怎么办?你重复同样的事情,覆盖旧版本。

  · 假设这种情况持续了一段时间,你发现有些东西坏了。他们改变了Foundation的某些内容,现在你必须回滚,但是要去哪里呢?你需要找到较旧的版本并开始应用它们,直到找到合适的版本为止。

  · 即使你能把这些都解决,那假设你现在开始着手别人的项目了,他们也使用 Foundation 吗?如果用了,它安装在哪里呢,它是什么版本呢?

  · 对于一个小的项目来说,这些看起来并不是什么大问题,但是请想象一下一个拥有 8-10 个依赖(这仍然不算很多)的项目会怎样。模块化管理将变得不可能做到,或者至少是浪费时间的。

  · 依赖管理通过自动化和标准化来解决这些问题。依赖的检索,如 Foundation、jQuery、Twig、Symphony、日志记录模块等等都可以通过以编程方式的方式来完成。还可以指定版本以防止冲突。

  · 依赖管理器将包的存储方式和使用位置标准化。在实际应用中,这意味着每个使用相同依赖管理器的项目都将遵循相同的结构 —— 至少对于那些依赖是这样。

安装 Composer

Composer 有各个系统的版本。 在 Windows 系统,你可以通过 Composer Setup 文件来安装,安装包可以在这个页面 找到。 在基于 Linux 的系统, 包括 OSX,你可以在本地使用以下命令来安装:

curl -sS https://getcomposer.org/installer | php

在你的项目目录运行上面的命令,你会得到一个 composer.phar 文件,该文件可以用来运行 Composer。 我更喜欢全局安装,这样就可以在任何目录下运行 Composer 命令。全局安装需要运行以下命令::

mv composer.phar /usr/local/bin/composer

运行这个命令可能有两种情况会产生错误。 一个是你没有管理员权限,这时你可以在命令前面加 sudo 再运行。

sudo mv composer.phar /usr/local/bin/composer

另一个是,在 Yosemite 上运行, 因为没有 usr 目录, 这个命令会报错,这时只要创建相应的目录再次运行就好了。

Composer 简介

使用 Composer 进行依赖管理由两个独立的元素组成。第一个是 Composer 本身,它是用于获取和管理依赖项的命令行工具。第二个是 Packaginst —— 主要的 Composer 库,它是存储了你可能想要使用的包的地方。

使用 Composer 时,依赖管理的核心是一个名为 composer.json 的 JSON 文件。具体内容如下:

你的项目想要引入的依赖将会列在 require 项中。在上述情况中,我引入了 Monolog,它是一个流行的日志记录框架。但是我仅有一个包含了这些信息的 JSON 文件并不意味着我就可以开始使用 Monolog 了。这时候就需要使用到命令行了。

使用命令行切换到项目文件夹中,然后输入 composer install 命令。这将把我所有的依赖引入到项目中,并做一些其他让代码整洁的事情。

它创建了一个 vendor 目录,该目录容纳了包括 Composer 在内的所有依赖项。截图中还显示了 Monolog 和 PSR,这是除 composer.lock 文件外 Monolog 的依赖项。

到此为止,你已经可以开始使用您的依赖项了,但是我们还能做更多的事情来提高效率。让我们进一步学习 Composer。

指定版本

在上面的代码中,我们指定了版本 1.12.0,但在某些情况下,我们可能希望得到更大的版本范围。有六种可以指定想要的版本的方法,让我们来看看它们:

1. 版本范围

使用比较运算符,你可以获取高于 1.3 并且低于 1.8 的版本,或者使用 AND 和 OR 逻辑获取更复杂的版本集。使用的运算符可以是 >,<,>=,<= 和 !=。AND 逻辑用空格或逗号表示,OR 逻辑用双竖线表示:||。

指定 >2.7 表示高于 2.7 的任意版本。>2.7 <=3.5 则表示高于 2.7 并低于 3.5(包括 3.5)的任何版本。

2. 通配符版本

通过使用通配符,你可以指定版本的模式。例如 2.3.*,它表示包括 2.3.0 及以上并且低于 2.4.0 (不包括 2.4.0)的所有版本。它等价于 >=2.3.0 <2.4。

3. 连字符范围

使用连字符能让你更容易地指定版本范围,但是它对于版本的特殊处理方式容易让人感到疑惑。一个完整的版本由三个数字组成,在这种情况下连字符范围是完全合理的。

2.0.0 - 3.0.0 连字符范围表示所有 2.0.0 以上并且在 3.0.0 以下的版本(包括了 2.0.0 和 3.0.0)都将被接受,等同于 >=2.0.0 <=3.0.0。

但是如果只指定了部分的版本号,如 2.0 - 3.0,意味着任何高于 2.0 的版本(包括 2.0)但低于 3.1 版本。

这种看似奇怪的行为是因为连字符左侧是包含的,右侧则会使用通配符进行补全。上面的表达式等同于 >=2.1 ❤️.1.0

4. 波浪号范围

~ 运算符可以很好地标记你所依赖的最小次要版本,并允许任何高于此版本内容,但不包括下一个主要版本。如果你指定 ~3.6,那么你将允许 3.6 及其以上的版本,但不包括 4.0 版本。

~ 运算符最好用示例解释:~3.6 等价于 >=3.6 <4.0.0,而 ~3.6.3 等价于 >=3.6.3 ❤️.7.0。正如你所看到的,它对于尊重 语义版本控制的项目来说是非常有用的。因为理论上应该没有向后兼容性破坏直到 4.0,它会运行良好。另一种理解方式是使用 ~ 指定一个最小版本,但允许指定的最后一个数字增长。

注意: 虽然 4.0-beta.1 是在 4.0 之前,但版本约束,如 ~3.6 不会安装它。正如上面所说的 ~3.6 只意味着 .6 可以改变,但 3. 部分是固定的。

注意: ~ 运算符对其主要发行号的行为有例外。这意味着,~1 与 ~1.0 是相同的,因为它不会允许主数字增加以试图保持向后兼容性。

5. 插入符

插入符范围用于允许所有非中断更新的情况。如果一个项目遵循语义版本控制,那么在小版本的更新中不应该破坏主版本的兼容性。也就是说,在你指定的该版本及以上的任何内容,不包括下一个主版本都不会破坏兼容性。它与 ~ 非常相似,但它更接近语义版本控制。通过指定 ^3.3.5,可以允许 3.3.5 及以上,但不包括 4.0 以上的版本。

注意: 主版本号为零(0.y.z)的软件处于开发初始阶段,一切都可能随时被改变,这样的版本被视为不稳定版。为了保证兼容,^

将不会更新到下一个小版本,如 ^0.3.0 等于 >=0.3.0 <0.4.0 而不是 >=0.3.0 <1.0.0。

6. Dev-Master

通过指定 dev-master,你将获取当前开发的最新版本,该版本尚未标记版本号。这在开发过程中可能很好,但你需要知道,在这些版本中,bug 的可能性更高。

依赖的锁定是 Composer 最有用的特性之一。我在前面提到过 composer.lock 文件,这个文件的作用就是是锁定所用组件的版本。

锁定文件可以确保每个人都使用着相同版本的文件。仅仅因为应用程序不应该由于组件更新而中断,并不意味着团队中所有的成员和生产服务器都应该运行不同的版本。

当你第一次使用 Composer 获取依赖项时,它会将确切的版本写入锁文件。如果指定了 2.3.* 版本,并且 2.3.5 是当时最新版本,则会安装 2.3.5 版本并将其记录在锁定文件中。

假设一个开发人员在 10 天后加入团队。这时,版本已经更新为 2.3.6。如果他使用正确的命令 (composer install),他将会安装 2.3.5 版本,因为它已记录在锁文件了。

当然,你依然可以更新依赖项。在这种情况下,你应该运行 composer update 命令。这将获取允许的最新版本并将其写入锁文件。然后将它分发给其他人,让他们更新版本。

开发依赖

Composer 允许你指定开发依赖。这是通过在 require-dev 数组中指定你的依赖而不是 require 数组来完成的。

Faker 是一个生成假数据的 PHP 类。这对开发很有用但对生产来说并不需要。

请注意,默认情况下始终会安装开发依赖,Composer 不会神奇地知道它何时在生产服务器上运行。如果要排除开发依赖,则需要运行 install 或者 update 命令时加上 --no-dev 选项

Composer 现状

Composer 在 PHP 开发中随处可见。 几乎所有大型和知名的网站组件,如 jQuery,Foundation,Bootstrap,甚至 WordPress 都有一个 Composer 包。

此外,较小但同样好用的代码包也可以通过 Composer 检索到。 如 Monolog 这样的日志记录包,PHP 邮件管理包,字符串操作类,PHP 单元和其他工具等等。

框架社区从 Composer 统一项目需求的能力中获益匪浅。 备受青睐的 Laravel,FuelPHP,Yii Framework 等框架都依靠 Composer 将功能整合并共享给其他项目。

当然最大的好处是不易察觉的。当你需要共享或部署代码时,Composer 非常好用。你不需要把大约 20-50MB 的相关但未使用的代码拖来拖去。你只需将它们写入 composer.json 和 lock 文件中,所有人都能在几分钟内得到同样的页面了。

结论

我希望我已经让你对 Composer 强大的功能有所了解,但其实你还能使用它来做更多的事情。除了我们讨论的内容之外,Composer 还为你提供了出色的自动加载功能,你可以将脚本挂接到更新过程的任何步骤等等。

任何小组项目都应该使用 Composer,但即使你单独工作,它还是非常实用的。它给你提供了很大的灵活性,并且给你的项目提供了不会过时的技术 ——你永远不知道什么时候你可能需要额外的帮助!

更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的PHP技术交流群953224940

进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容