重新介绍 Composer —— 现代化 PHP 应用的基石

在这篇文章中,我们将讨论Composer的一些的基础知识, 以及是什么使它成为一个如此强大而有力的工具。

在详细讨论之前,我们需要知道两件事:

  • Composer是什么:

正如我们在他们的 网站上看到的那样: "Composer 是PHP依赖管理的工具. 它允许你声明你的项目所依赖的库并且它将为你管理(安装/更新) 它们."

  • Composer 不是什么:

Composer 不是包管理器. 它用"per project" 这种方式处理包.虽然它提供了一种全局安装选项 ,但默认情况下它不会在全局安装任何东西。

基本上, Composer 允许你声明和管理PHP项目中的每个依赖项.

现在就开始安装Composer ,这样我们就可以看到它了.

file

安装

安装 Composer 有两种方式:本地和全局。因为 Composer 是一个非常有用和广泛使用的工具,所以我总是建议在全局范围内安装它,因为您可能会同时在多个项目中使用它。

请注意,如果您使用Homestead Improved等环境,则默认情况下会全局安装。如果你对 VagrantHomestead 不熟悉,这篇文章 会帮你解决,如果你想深入研究下去,请看这本 this book will reveal some wild mysteries to you

要安装Composer,请按照说明获取您的操作系统。

如果你使用的是 Unix 系统,安装后你可以运行命令:

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

这将 composer.phar 文件移动到路径上的一个目录(缺省情况下操作系统查找可执行文件的文件系统的位置)。这样,你可以使用 composer 命令而不是 composer.phar
运行 composer 命令将会展示以下页面信息:

file

一些有用的 composer 命令:

  • composer help <command> -- 显示给定命令的帮助页面.
  • composer self update -- 更新到最新的可用版本.
  • composer search -- 搜索依赖包.
  • composer status --显示一组本地被更新的依赖. 如果从源代码中安装一些 东西(用 --prefer-source 选择项), 最终我们将会在 /vendor 文件夹克隆该包. 如果我们修改了包信息, composer status 命令将会使用 git 展示这些修改.
  • composer diagnose -- 诊断系统的常见错误. 这对于调试非常有用, 因为它检查一些例如连接到包、可用磁盘空间和 git 的设置等.

我们将注意力集中在 composer initcomposer 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

一些包能够派上用场如果以全局的方安装。例如, SpressLaravel 有命令行工具来生成新的项目, 重新运行一些常见的命令。还有,一个测试工具,像PHPUnit 可以从系统中的任何一个位置运行,并使得项目的测试更加轻松。

通常情况下,Packages 能够被全局安装通过这个 global 选项,
像这样:

composer global require phpunit/phpunit

我们大体上发现当遵循专业和现代的方法在开发在一个独立的环境中时,global require 是100%安全的。

Packagist

file

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 文件。

file

这个最后的事情我们需要增加 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://www.sitepoint.com/re-introducing...

译文地址:https://learnku.com/php/t/7869/re-introd...

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 2

@Summer 纠错时左边是不是应该是翻译过的文字:

file

6年前 评论
Summer

@dinghua fixed

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!