自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 文件。具体内容如下:
{ "name": "danielpataki/my_project", "description": "My New Project", "authors": [ { "name": "Daniel Pataki", "email": "[email protected]" } ], "require": { "monolog/monolog": "1.12.0" } }
你的项目想要引入的依赖将会列在 require 项中。在上述情况中,我引入了 Monolog,它是一个流行的日志记录框架。但是我仅有一个包含了这些信息的 JSON 文件并不意味着我就可以开始使用 Monolog 了。这时候就需要使用到命令行了。
使用命令行切换到项目文件夹中,然后输入 composer install 命令。这将把我所有的依赖引入到项目中,并做一些其他让代码整洁的事情。
它创建了一个 vendor 目录,该目录容纳了包括 Composer 在内的所有依赖项。截图中还显示了 Monolog 和 PSR,这是除 composer.lock 文件外 Monolog 的依赖项。
到此为止,你已经可以开始使用您的依赖项了,但是我们还能做更多的事情来提高效率。让我们进一步学习 Composer。
指定版本
在上面的代码中,我们指定了版本 1.12.0,但在某些情况下,我们可能希望得到更大的版本范围。有六种可以指定想要的版本的方法,让我们来看看它们:
版本范围
使用比较运算符,你可以获取高于 1.3 并且低于 1.8 的版本,或者使用 AND 和 OR 逻辑获取更复杂的版本集。使用的运算符可以是 >,<,>=,<= 和 !=。AND 逻辑用空格或逗号表示,OR 逻辑用双竖线表示:||。
指定 >2.7 表示高于 2.7 的任意版本。>2.7 <=3.5 则表示高于 2.7 并低于 3.5(包括 3.5)的任何版本。
通配符版本
通过使用通配符,你可以指定版本的模式。例如 2.3.*,它表示包括 2.3.0 及以上并且低于 2.4.0 (不包括 2.4.0)的所有版本。它等价于 >=2.3.0 <2.4。
连字符范围
使用连字符能让你更容易地指定版本范围,但是它对于版本的特殊处理方式容易让人感到疑惑。一个完整的版本由三个数字组成,在这种情况下连字符范围是完全合理的。
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
波浪号范围
~ 运算符可以很好地标记你所依赖的最小次要版本,并允许任何高于此版本内容,但不包括下一个主要版本。如果你指定 ~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 是相同的,因为它不会允许主数字增加以试图保持向后兼容性。
插入符
插入符范围用于允许所有非中断更新的情况。如果一个项目遵循语义版本控制,那么在小版本的更新中不应该破坏主版本的兼容性。也就是说,在你指定的该版本及以上的任何内容,不包括下一个主版本都不会破坏兼容性。它与 ~ 非常相似,但它更接近语义版本控制。通过指定 ^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。
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 数组来完成的。
{ "name": "danielpataki/my_project", "description": "My New Project", "authors": [ { "name": "Daniel Pataki", "email": "[email protected]" } ], "require": { "monolog/monolog": "1.12.0" }, "require-dev" : { "fzaninotto/faker", "dev-master" } }
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,但即使你单独工作,它还是非常实用的。它给你提供了很大的灵活性,并且给你的项目提供了不会过时的技术 ——你永远不知道什么时候你可能需要额外的帮助!
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】
更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)