重新介绍 Composer —— 现代化 PHP 应用的基石
在这篇文章中,我们将讨论Composer的一些的基础知识, 以及是什么使它成为一个如此强大而有力的工具。
在详细讨论之前,我们需要知道两件事:
- Composer是什么:
正如我们在他们的 网站上看到的那样: "Composer 是PHP依赖管理的工具. 它允许你声明你的项目所依赖的库并且它将为你管理(安装/更新) 它们."
- Composer 不是什么:
Composer 不是包管理器. 它用"per project" 这种方式处理包.虽然它提供了一种全局安装选项 ,但默认情况下它不会在全局安装任何东西。
基本上, Composer 允许你声明和管理PHP项目中的每个依赖项.
现在就开始安装Composer ,这样我们就可以看到它了.
安装
安装 Composer 有两种方式:本地和全局。因为 Composer 是一个非常有用和广泛使用的工具,所以我总是建议在全局范围内安装它,因为您可能会同时在多个项目中使用它。
请注意,如果您使用Homestead Improved等环境,则默认情况下会全局安装。如果你对 Vagrant
和 Homestead
不熟悉,这篇文章 会帮你解决,如果你想深入研究下去,请看这本 this book will reveal some wild mysteries to you。
要安装Composer,请按照说明获取您的操作系统。
如果你使用的是 Unix
系统,安装后你可以运行命令:
mv composer.phar/usr/local/bin/composer
这将 composer.phar
文件移动到路径上的一个目录(缺省情况下操作系统查找可执行文件的文件系统的位置)。这样,你可以使用 composer
命令而不是 composer.phar
。
运行 composer
命令将会展示以下页面信息:
一些有用的 composer
命令:
composer help <command>
-- 显示给定命令的帮助页面.composer self update
-- 更新到最新的可用版本.composer search
-- 搜索依赖包.composer status
--显示一组本地被更新的依赖. 如果从源代码中安装一些 东西(用--prefer-source
选择项), 最终我们将会在/vendor
文件夹克隆该包. 如果我们修改了包信息,composer status
命令将会使用git
展示这些修改.composer diagnose
-- 诊断系统的常见错误. 这对于调试非常有用, 因为它检查一些例如连接到包、可用磁盘空间和git
的设置等.
我们将注意力集中在 composer init
, composer create-project
和 composer require
.
使用 Composer
在项目中管理依赖项, Composer 使用 json
格式文件. 这个文件描述了所有的依赖项, 并且也可以很好的存储一些元数据。
在这个例子中我们将会创建一个新的 PHP 项目并且使用 PHPUnit 用来做单元测试。 有下面的几种方法去使用 Composer 管理这些依赖。
-
composer init
将会启动向导。 这个向导会指导我们生成composer.json
配置文件。 -
composer search phpunit
将会查找所有可以找到的包含phpunit
关键字的包。 然后选择我们需要的包, 我们使用composer require <package>
命令。 这个命令不仅会生成composer.json
文件,它也会下载所有我们指定的依赖包。 -
手工写
composer.json
文件 (不推荐 -- 很容易发生语法错误并且也不会来带好处). 下面是一个例子:
{
"require": {
"phpunit/phpunit": "^4.8"
}
}
-
require
键包含这些包名 (例如phpunit/phpunit
) 和约束版本号 (例如4.8
) 的包对象信息。 Composer 使用这些信息去你使用repositories
键注册的 "包仓库 (repositories) " 中搜索正确的包 (更多信息请看 here) 或 Packagist, 默认的包仓库我们在后面讨论。
如果你使用 composer init
亦或者手动创建初始文件,你都需要执行 composer install
命令。这将下载 composer.json
文件中所有存在依赖关系的包。
请注意手动在composer.json
中添加包并执行 composer install
与直接执行 composer require <package>
相同。
使用
composer require <package>
这种方法是推荐的最佳实践.
首次运行 composer install
命令时会下载与依赖关系相关的包,并将其安装的版本注册到 composer.lock
文件中。 下次有人在此项目执行 composer install
, 它将不会去获取最新的可用包版本,而是通过寻找composer.lock
中已经注册的版本进行安装。 通过这种方式, Composer可以确保您的项目不会因新版本软件包中意想不到的代码变更而报错。
更新你的软件包
composer.lock
文件通过不允许下载新版本的软件包来确保项目中的每个人都使用相同版本的软件包。
如果因为某种原因我们想要坚持使用一个特定的版本,那么我们应该在, composer.json
文件中添加你所需要的版本. 例如:
{
"require": {
"phpunit/phpunit": "4.8"
}
}
但是,如果我们想要更新依赖包到最新的版本呢?
为了更新依赖,Composer提供了 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.json
文件中 ,使用这个 autoload
这个键
{
"autoload": {
"psr-4": {"Foo\\": "src/"}
}
}
First, Composer 将注册一个 PSR-4 自动加载对象 对于 Foo
命名空间。
Then, 我们映射这个 Foo
命名空间到 /src
文件夹。这个 /src
文件夹应该位于与 /vendor
文件夹的同一级(项目的根目录)。After this,我们需要重新生成 vendor/autoload.php
这个文件, Composer 提供了一个命令 composer dump-autoload
。
- 小提示:
composer du
也能用, 因为 Composer 运行任何命令 ,确定的都是前几个字母,Composer 命名空间中没有 其他以du
开头的命令,所以 Composer 知道那一个是我们想要的,这适合与所有的 Composer 命令。
这个方法我们将自己的代码添加到自动加载对象中,除了 PSR-4 自动加载, Composer也支持PSR-0,类映射和文件自动加载 。查看这个文档 获取更多的信息关于Composer 的自动加载
配置项和Minimum Stability(最低稳定性)
有时,你的项目将依赖一个没有稳定版本的包,而 Composer 默认是会禁止这些不稳定包的安装。
在这种情况下,最简单的办法就是在 composer.json
文件中添加 minimum-stability
这个键和值,这样的话,Composer 将会允许这些不稳定包的安装。
命令配置方法如下:
composer config minimum-stability dev
当然,Composer 几乎所有的配置项都可以通过命令的方式来编辑。 如果你也想了解其他配置的详细信息,请点击查看详细文档 。
全局 Packages
一些包能够派上用场如果以全局的方安装。例如, Spress 和 Laravel 有命令行工具来生成新的项目, 重新运行一些常见的命令。还有,一个测试工具,像PHPUnit 可以从系统中的任何一个位置运行,并使得项目的测试更加轻松。
通常情况下,Packages 能够被全局安装通过这个 global
选项,
像这样:
composer global require phpunit/phpunit
我们大体上发现当遵循专业和现代的方法在开发在一个独立的环境中时,global require
是100%安全的。
Packagist
Packagist 是一个 Composer 主要的仓库。 这是所有 Compose包被聚在一起的地方,这便意味这当我们执行 composer search <package>
这个命令时,我们搜索的实际上是 Packagist。这个 Packagist 网站也提供所有软件包的信息和搜索排序引擎。这样 PHP 开发者就不用花费几天的时间去 Github 上寻找包了。
Packagisr 不仅仅汇集了所有的PHP包,它也鼓励 PHP 开发者提交他们自己的包在上面,不断的壮大这个社区。
提交一个 Package 向 Packagist
让我们创建一个简单的PHP包,这样我们能了解向 Packagist 提交是多么容易。 我们将创建一个简单的类实现英寸和厘米之间的转换,让我们创建一个 /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
命令去运行向导和生成 compoer.json
文件。
这个最后的事情我们需要增加 autoload 键在我们的 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
在指令行测试便会产生你想要的结果。.
为了将该软件包提交到Packagist,我们需要把它推到一个Github 存储库。然后,我们使用自己的Github帐号来注册 Packagist,再点击 Submit
, 并显示出我们最新创建的GitHub 存储库所在位置.
记得一定要随时更新Packagis只要你更新你的GitHub 里的存储库!您既可以将Packagist配置成自动更新,也可以访问自己的Packagist上的软件包并点击
Update
按钮。这样,你Packagist里的软件包将一直显示出自己的软件包里的GitHub状态。
结论
Composer已经彻底革新了PHP开发人员的工作方式,并承诺继续这样做下去。对于任何一位PHP开发人员的工具带来说,它是一个强大而重要的工具,也是许多现代的PHP应用程序的基石。
你在用Composer吗?关于它你有什么不清楚的吗?请在下面的评论中告诉我们。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
@Summer 纠错时左边是不是应该是翻译过的文字:
@dinghua fixed