在本文中,我们将讨论 Composer 的基础知识,以及是什么让它成为如此强大和有用的工具。在我们详细介绍之前,我们需要牢记两件事:
- 什么是作曲家: 正如我们在他们的网站上看到的:“Composer 是 PHP 中用于依赖管理的工具。它允许你声明你的项目所依赖的库,它将为你管理(安装/更新)它们。
- 作曲家不是什么: Composer 不是包管理器。它以“每个项目”的方式处理包。虽然它提供了全局安装选项,但默认情况下它不会全局安装任何内容。
从本质上讲,Composer 允许您声明和管理 PHP 项目的每个依赖项。 现在让我们安装 Composer,以便我们可以看到它的实际效果。
安装
安装 Composer 有两种方法:本地和全局。因为 Composer 是一个非常有用且广泛使用的工具,我总是建议在全球范围内安装它,因为您可能会同时处理多个项目。请注意,如果使用像 Homestead Improved 这样的环境,则默认情况下会全局安装它。如果你不熟悉 Vagrant 和 Homestead,这篇文章会澄清一些事情,如果你想更深入地了解,这本书将为你揭示一些疯狂的奥秘。要安装 Composer,请按照适用于您的操作系统的说明进行操作。 如果您使用的是 Unix 系统,则在安装后可以运行以下命令: 这会将文件移动到路径上的目录(默认情况下,操作系统查找可执行文件的文件系统位置)。这样,您可以只使用命令而不是 . 运行该命令会显示信息页面: Composer 的一些更有用的命令是:mv composer.phar /usr/local/bin/composer
composer.phar
composer
composer.phar
composer
composer help <command>
– 将显示给定命令的帮助页面。composer self update
– 将 composer 更新到最新的可用版本。composer search
– 搜索包裹。composer status
– 显示已在本地修改的依赖项列表。如果我们从源代码安装某些内容(使用该选项),我们最终将在文件夹中获得该包的克隆。如果我们对该包进行一些更改,该命令将向我们显示这些更改的 git 状态。--prefer-source
/vendor
composer status
composer diagnose
– 诊断系统的常见错误。这对于调试特别有用,因为它会检查与 Packagist 的连接、可用磁盘空间和 git 设置等内容。
我们将把注意力集中在 和 上。composer init
composer create-project
composer require
使用 Composer
为了管理项目中的依赖项,Composer 使用文件。此文件描述了所有依赖项,并保存了一些元数据。 在这个例子中,我们将创建一个新的PHP项目,在这个项目中,我们将需要PHPUnit进行单元测试。有几种方法可以使用 Composer 来管理此依赖项。
json
composer init
将启动向导。该向导将指导我们生成文件。composer.json
composer search phpunit
将搜索具有关键字 的所有可用包。选择所需的包后,我们可以使用 .此命令不仅会创建文件,还会下载指定的所有依赖项。phpunit
composer require <package>
composer.json
- 手动编写文件(不推荐 - 语法容易失误,并且没有明显的好处)。下面是一个示例:
composer.json
{ "require": { "phpunit/phpunit": "^4.8" } }
- 该键采用将包名称(例如)映射到版本约束(例如)的对象。Composer 使用此信息在使用密钥注册的包“存储库”中搜索正确的文件集(更多信息请点击此处)或在 Packagist(我们稍后将讨论的默认包存储库)上搜索。
require
phpunit/phpunit
4.8
repositories
如果使用或手动方法,则需要运行 .这将下载文件中描述的包所需的所有依赖项。 请注意,手动写入文件然后运行与运行 .
composer init
composer install
composer.json
composer install
composer require <package>
建议使用该方法是最佳做法。composer require <package>
首次运行该命令时,将下载依赖项,并在文件中注册其已安装的版本。下次有人运行该项目时,它不会获取最新的可用包版本,而是获取文件中注册的包版本。这样,Composer 可以确保您的项目不会因较新版本的包中的意外代码更改而中断。
composer install
composer.lock
composer install
composer.lock
更新您的程序包
该文件通过不允许下载较新版本来确保项目中的每个人都使用相同版本的包。 如果出于任何原因我们想坚持使用特定版本,那么我们应该在文件中提及适当的版本。例如: 但是,如果我们想将依赖项更新到最新版本怎么办? 要更新依赖项,Composer 提供了该命令。此命令不仅会下载我们依赖项的最新版本,还会将文件更新到新版本。运行其实和删除然后重新运行是一样的。
composer.lock
composer.json
{
"require": {
"phpunit/phpunit": "4.8"
}
}
composer update
composer.lock
composer update
composer.lock
composer install
通常建议在处理项目(应用程序)时将文件提交到版本控制系统中,而在处理包时忽略它。包应始终努力使用其依赖项的最新版本,而应用通常更脆弱。有关此方法和替代方法的更多讨论,请点击此处。composer.lock
供应商文件夹
Composer 将所有依赖项下载到文件夹中,如果该文件夹不存在,则创建该文件夹。它还会创建一个文件,如下所示: 一旦你或这个文件进入你的代码,你就可以使用你的依赖项提供的所有功能。这就像将以下代码片段添加到代码中一样简单:
/vendor
vendor/autoload.php
<?php // autoload.php @generated by Composer require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit7a731d2067108a4739c3dd65be722f17::getLoader();
include
require
require __DIR__ . '/vendor/autoload.php';
自动加载
Composer 提供的用于访问项目依赖项的自动加载非常有用,也可用于访问我们自己的应用程序代码。为此,我们需要使用密钥在文件中注册我们的代码。 首先,Composer 将为命名空间注册一个 PSR-4 自动加载器。 然后,我们将命名空间映射到文件夹。文件夹应与文件夹(项目的根目录)处于同一级别。在此之后,我们需要重新生成文件。Composer 为此提供了一个命令:.专业提示:
composer du
也可以工作,因为 composer 运行任何由其前几个字母唯一标识的命令。在 dump-autoload
的情况下,Composer 命名空间中没有其他以 du
开头的命令,因此 Composer 知道这就是我们想要的命令。这适用于所有 Composer 命令。这样,我们就可以将自己的代码添加到自动加载器中。除了 PSR-4 自动加载外,Composer 还支持 PSR-0、类映射和文件自动加载。有关使用 Composer 自动加载的更多信息,请查看文档。composer.json
autoload
{ "autoload": { "psr-4": {"Foo\\": "src/"} } }
Foo
Foo
/src
/src
/vendor
vendor/autoload.php
composer dump-autoload
配置值和最小稳定性
有时,您的项目将依赖于没有发布稳定版本的软件包。Composer 默认阻止安装不稳定的软件包。 在这些情况下,很容易将标志添加到文件中,Composer 将允许安装它们。 几乎所有的配置值都可以从命令行进行编辑,如文档的这一部分所述。minimum-stability
composer.json
composer config minimum-stability dev
全球套餐
如果全局安装,某些软件包可以派上用场。例如,像 Spress 和 Laravel 这样的工具可以有命令行工具来生成新项目、重新运行一些常用命令等。同样,像 PHPUnit 这样的测试套件可以从系统的任何部分运行中受益,并使它正在测试的项目更加轻巧。 通常,可以使用以下选项全局安装软件包,如下所示: 然而,根据一些人的说法,这被认为是有害的。您的里程可能会有所不同——我们通常发现,当遵循在隔离环境中进行开发的专业和现代方法时,使用起来是 100% 安全的。global
composer global require phpunit/phpunit
global require
包装商
Packagist 是 Composer 的主要存储库。这是所有 Composer 包聚合的地方,这意味着当我们执行时,我们实际上是在搜索 Packagist。Packagist 网站还包含有关所有软件包的信息以及有用的搜索和排序引擎。这样,PHP 开发人员就不必花费数天时间在 Github 上搜索软件包。 Packagist 不仅聚合了 PHP 包,还鼓励 PHP 开发人员提交自己的包,从而加强了社区。composer search <package>
向 Packagist 提交包
让我们创建一个简单的 PHP 包,这样我们就可以看到将其提交给 Packagist 是多么容易。我们将创建一个简单的类,将英寸转换为厘米,将厘米转换为英寸。让我们创建一个文件。在此文件中,我们将有以下代码: 正如你所看到的,一个非常简单的类。第二步是导航到项目的根目录并运行命令以运行向导并生成文件。 我们需要做的最后一件事是将自动加载密钥添加到我们的文件中。最终文件应如下所示: 现在让我们运行,以便可以创建自动加载器。然后,让我们测试我们的包。在项目的根目录中,让我们创建一个文件。 正如你所看到的,我们正在使用该行来自动加载我们的类,然后使用它来做一些转换。 在命令行上测试它应该会产生所需的结果。 要将此包提交给 Packagist,我们需要将其推送到 Github 存储库。然后,我们使用我们的 Github 帐户登录 Packagist,点击 ,然后指向我们新创建的 Github 存储库。/src/Converter/Converter.php
<?php namespace Converter; class Converter { public function convertToCm($value) { return $value * 0.3937; } public function convertToInch($value) { return $value * 2.54; } }
composer init
composer.json
composer.json
{ "name": "dailymatters/inch-conv", "description": "Inch To Cm converter", "type": "library", "license": "creative commons", "authors": [ { "name": "DailyMatters", "email": "email@gmail.com" } ], "minimum-stability": "dev", "require": {}, "autoload": { "psr-0": { "Converter": "src/" } } }
composer install
index.php
<?php require_once '/vendor/autoload.php'; use Converter\Converter; $conv = new Converter; $result = $conv->convertToCm(1); echo $result; $result = $conv->convertToInch(1); echo $result;
require_once '/vendor/autoload.php';
php index.php
Submit
每当您在 Github 中更新存储库时,请记住更新 Packagist!您可以将 Packagist 配置为自动执行此操作,也可以在 Packagist 上访问您的软件包并单击按钮。这样,您在 Packagist 中的包将始终镜像包的 Github 状态。Update
发表评论 取消回复