文档结构  
翻译进度:已翻译     翻译赏金:10 元 (?)    ¥ 我要打赏

在本文中,我们将讨论Composer的基础知识,以及如何让它成为一个强大而又实用的工具。

在我们详情讨论之前,我们需要注意两件事情:

  • Composer是什么:

    我们在官网上可以看到:“Composer是PHP中用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你安装(更新)这些依赖的库文件。”

  • Composer不是什么:

    Composer不是一个包管理器。的确,它涉及“packages”,但它在每个项目的基础上进行管理。虽然它提供了全局安装选项,但它默认情况下不会在全局安装任何东西。

第 1 段(可获 1.38 积分)

基本上,Composer允许你使用并管理你的PHP项目中的每一项依赖。现在,我们将安装Composer,通过实践来看下如何使用它。

Composer Logo

安装

Composer支持两种:局部和全局。因为Composer是一个非常有用且被广泛使用的工具,你不太可能仅仅使用在一个项目上,所以我总是推荐全局安装。

请注意,如果你实在使用一些集成环境比如 Homestead Improved,Composer会被默认全局安装。如果你对Vagrant和Homestead不熟悉,这篇文章能帮你搞清楚,如果你想更加深入的了解, 这本书能会很适合你

第 2 段(可获 1.4 积分)

安装Composer,可以查阅对应操作系统的官方介绍

如果是类Unix系统,完成安装后你可以使用如下命令:

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

这将把 composer.phar 文件移动到你的系统目录(你的操作系统执行命令所查找的默认路径)。通过这样,你可以使用 composer 来代替 composer.phar

运行 composer 命令,显示如下信息页面:

Composer main information

一些Composer有用的命令:

  • composer help <command> – 显示给出的命令<command>帮助信息。
  • composer self update – 更新Composer自己到最新版本。
  • composer search – 搜索一个软件包。
  • composer status – 显示本地被改动的依赖项清单。如果我们从源码安装一些东西(使用--prefer-source选项),我们将会在 /vender 克隆这个包。如果我们对这个包有任何改动, composer status 命令会像 git status 命令一样,展示出有哪些变动。
  • composer diagnose – 诊断系统中常见的错误。这个命令对于调试非常有用,它会检查系统到Packagist的连接,剩余空间以及 git 设置等内容。
第 3 段(可获 2.18 积分)

我们将关注点放在 composer init, composer create-projectcomposer require几个命令上。

使用 Composer

Composer 是使用一个 json 文件来管理项目依赖。这个文件记录了所有的依赖项,和一些其他元数据信息。

在这个示例中,我们将创建一个包含 单元测试 的 PHP 项目。

  • composer init 将运行初始化向导。该向导将指引我们生成 composer.json 文件

  • composer search phpunit 将搜索所有包含关键字 phpunit 的可用包。当我们选择了我们需要的包后,可以使用 composer require <package> 安装,该命令不仅会创建或更新 composer.json 文件,也会完成该包所有依赖项的下载。

  • 手动更新 composer.json (并不推荐,这很容易导致语法错误,也不会带来明显的好处)。这里我们举一个例子:

第 4 段(可获 1.69 积分)
{
    "require": {
        "phpunit/phpunit": "^4.8"
    }
}

 

  • 关键字 require使用对象来声明包名(例如:phpunit/phpunit)和版本(例如:4.8)。 Composer使用这个信息去使用`repositories`关键词(更多信息点这里)配置的仓库或者 Packagist 仓库去检索包。

如果你使用`composer init`或手动方法初始化项目,你需要运行`composer install`命令。这个命令会下载`composer.json`中描述所需的所有依赖包。

第 5 段(可获 0.98 积分)

注意:手动编写文件,然后运行composer install正如运行composer require<package>一模一样。

对于composer require <package> 的使用方法就是一套倍受大家推崇的最佳方案.

在你第一次运行 composer install指令时,各种依赖关系就被下载下来以及各种安装的版本也在composer.lock文档注册好了。下一次若有人在项目上运行composer install时,因其无法获得最新的版本,所以他只能运行那些已在composer.lock文档注册好的文件。通过这种方式,Composer便能确保您的项目不会因为在软件包的新版本里出现的意外代码更改而被迫中断。

第 6 段(可获 1.11 积分)

更新您的软件包

虽然composer.lock文档确保项目中的每个用户都使用相同的软件包版本,但我们却不允许下载其更新的版本。

如果出于任何原因,我们都宁愿用某一特定版本,而不愿用说到的在composer.json文档里那个恰如其分的版本。例如:

  {
      "require": {
          "phpunit/phpunit": "4.8"
      }
  }

但是,如果我们想更新自己的依赖关系到最新版本,我们该咋办呢?

为了更新各种依赖关系,Composer提供了composer update指令。该命令不仅会下载我们各种依赖关系的最新版本,而且它也会将composer.lock文档更新至最新版本。运行 composer update 实际上如同删除composer.lock一模一样,然后再重新运行composer install就搞定了.。

第 7 段(可获 1.28 积分)

当处理一个项目(APP)通常建议提交composer.lock文件到版本控制系统 ,在运行一个软件包时忽略它。软件包应该始终努力使用最新版本的依赖项,而应用程序通常更为脆弱。更多关于这个和其他方法的讨论请点击这里。

供应商目录

作曲家将所有依赖项下载到/vendor文件夹中, 如果它不存在就建立一个。 它还创建一个vendor/ autoload.php文件看起来像这样:

<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInit7a731d2067108a4739c3dd65be722f17::getLoader();
第 8 段(可获 1.05 积分)

一旦你想在自己的代码中include或 require 这个文档,你就可以使用依赖关系所提供的全部功能。这就像在你的代码中添加下面的代码片段一样简单极了:

require __DIR__ . '/vendor/autoload.php';

自动下载

用由Composer所提供的自动下载去访问项目的各种依赖关系真是太有用了,我们也可以用它来访问自己的应用程序代码。要做到这一点,我们需要使用 autoload 键在composer.json文档注册我们的代码。

{
    "autoload": {
        "psr-4": {"Foo\\": "src/"}
    }
}

首先, Composer将为Foo的命名空间注册一个 PSR-4自动下载器

第 9 段(可获 1.03 积分)

接着,我们将Foo的命名空间映射到/ src文件夹。这个/ src文件夹应该和 /vendor 文件夹(即项目的根目录)处于同一层次。在这之后,我们需要去重新创建vendor/autoload.php文档。Composer为此提供了一项指令:composer dump-autoload。

专业提示:composer du也可运行,因为composer运行任何由前几个字母来作为唯一辨别的指令。对于dump-autoload的特殊情况,凡是开头是du的Composer命名空间就无需输入其它指令了,所以Composer会识别出那正是我们所要的指令。这适用于所有Composer的指令。

第 10 段(可获 1.06 积分)

我们这么做就能把我们自己的代码添加到自动下载器里。Composer除了能进行PSR-4的自动下载,它也支持psr-0,ClassMap和各种文档的自动下载。若了解更多关于用Composer去下载的信息请看必备资料.

配置值和最小稳定性

有时,您做的项目会随着已经发行但还没有稳定版本的文件包而定。Composer默认为防止安装各种不稳定的软件包。

在那些情况下,我们很容易就可将minimum-stability添加到composer.json文档里,并且Composer将允许把它们都安装下来。

第 11 段(可获 1.04 积分)

composer config minimum-stability dev

可以从指令行编辑几乎所有的配置值,正如该文档的 这一部分里所解释的那样。

全局软件包

若想将全局软件包都安装下来,一些软件包可以派上用场。一个典型的例子,如 SpressLaravel两个工具就可以有各种指令行工具,目的是为了创建新项目和再运行一些常用命令等。同样,像PHPUnit 那样一组测试套件可以从运行该系统的任何一部分中获益,并且使正测试的项目能更轻松地通过。

一般来说,各种软件包可以用全局(global)选项来全局安装,像这样:

第 12 段(可获 1.13 积分)

composer global require phpunit/phpunit

然而, 根据一些人的想法, 这会被认为是有害无益的。.你所面临的情况可能各有千秋——我们一般都认为,当我们在一个隔离的环境中开发出一套既专业又现代的方法后,global require就百分之百可安全使用了.

Packagist

Packagist

Packagist 是Composer的主要存储库。在此所有的Composer软件得以汇总,这就意味着当我们执行 composer search <package>指令时我们实际上正在搜索Packagist。Packagist网站也有所有软件包的信息和一个有用的搜索和分门别类引擎。这样,开发人员不必每天花时间在GitHub上搜寻各种软件包了。

第 13 段(可获 1.19 积分)

Packagist不仅汇总了PHP的各种软件包,而且它还鼓励PHP开发人员提交自己的各种软件包来加强该社区。

向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;
    }
}
第 14 段(可获 0.98 积分)

正如你所看到的,这是一个非常简单的类。第二步是将其导航到我们项目的根目录并划一下 composer init指令来运行向导随后生成composer.json文档。

Run init on our package

我们需要做的最后一件事就是把自动下载的密钥添加到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/"
        }
    }
}
第 15 段(可获 0.68 积分)

现在让我们来运行 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在指令行测试便会产生你想要的结果。

第 16 段(可获 0.76 积分)

为了将该软件包提交到Packagist,我们需要把它推到一个Github 存储库。然后,我们使用自己的Github帐号来注册 Packagist,再点击Submit,并显示出我们最新创建的GitHub 存储库所在位置。

记得一定要随时更新Packagis只要你更新你的GitHub 里的存储库!您既可以将Packagist配置成自动更新,也可以访问自己的Packagist上的软件包并点击 Update按钮。这样,你Packagist里的软件包将一直显示出自己的软件包里的GitHub状态。

结论

Composer已经彻底革新了PHP开发人员的工作方式,并承诺继续这样做下去。对于任何一位PHP开发人员的工具带来说,它是一个强大而重要的工具,也是许多现代的PHP应用程序的基石。

你在用Composer吗?关于它你有什么不清楚的吗?请在下面的评论中告诉我们。

第 17 段(可获 1.66 积分)

文章评论