composer介绍

基本用法

简介

对于我们的基本用法介绍,我们将安装monolog/monolog一个日志库。

注意:为简单起见,本简介假设你已执行composer的本地安装。

composer.json:项目设置

要在项目中开始使用composer,您只需要一个composer.json文件。此文件描述了项目的依赖关系,也可能包含其他元数据。

在require关键

您指定的第一个(通常也是唯一的)composer.json是require密钥。您只是告诉composer您的项目所依赖的包。

{
	"require": {
		"monolog/monolog": "1.0.*"
	}
}

如您所见,require采用将包名称(例如monolog/monolog)映射到版本约束(1.0.*)的对象。

composer使用此信息在您使用repositories秘钥注册的软件包“存储库”中搜索 正确的文件集,或者在默认软件包存储库Packagist中搜索。在上面的示例中,由于没有在composer.json文件中注册其他存储库,因此假定monolog/monolog包已在Packagist上注册。(请在下面查看有关Packagist的更多信息,或者在此处阅读有关存储库的更多信息)。

包名称

包名由供应商名称和项目名称组成。通常这些都是相同的-供应商名称仅用于防止命名冲突。例如,它允许两个不同的人创建一个名为的库json。一个可能被命名igorw/json而另一个被命名为seldaek/json。

阅读有关在此处发布包和包命名的更多信息。(请注意,您还可以将“平台软件包”指定为依赖项,允许您需要某些版本的服务器软件。请参阅下面的平台软件包。)

包版本约束

在我们的示例中,我们使用版本约束请求包monolog包1.0.*。这意味着1.0开发分支中的任何版本,或者任何大于或者等于1.0且小于1.1(>=1.0 <1.1)的版本。

请阅读版本以获取有关版本的更深入信息,版本之间的相互关系以及版本限制。

composer如何下载正确的文件?在指定依赖时composer.json,composer首先获取您请求的包名称,并在使用该repositories键注册的任何存储库中搜索它。如果您尚未注册任何额外的存储库,或者在您指定的存储库中找不到具有该名称的软件包,则会退出Packagist(更多信息如下)。

当composer在Packagist或者您指定的repo中找到正确的包时,它会使用包的vcs的版本控制功能(即分支和标记)来尝试找到您指定的版本约束的最佳匹配。请务必阅读版本文章中的版本和程序解析。

注意:如果您尝试要求程序包但composer会引发有关程序包稳定性的错误,则您指定的版本可能不符合默认的最低稳定性要求。默认情况下,在vcs中搜索有效的软件包版本时,仅考虑稳定版本。
如果您尝试要求包的dev,alpha,beta或者rc版本,则可能会遇到此问题。阅读有关稳定性标志和架构页面minimum-stability上的键的更多信息。

安装依赖项

要为项目安装已定义的依赖项,请运行该install命令。

php composer.phar install

运行此命令时,可能会发生以下两种情况之一:

没有安装composer.lock

如果您之前从未运行过该命令并且也没有composer.lock文件存在,则composer指挥解析composer.josn文件中列出的所有依赖项,并将其最新版本的文件下载到vendor项目的目录中。(该vendor目录是项目中所有第三方代码的常规位置)。在上面的示例中,您将最终获得monolog源文件vendor/monolog/monolog/。如果monolog列出了任何依赖项,那么它们也会下下面的文件夹中vendor/。

提示:如果您使用的git为您的项目,你可能要添加vendor在你的.gitignore。您真的不想将所有第三方代码添加版本化的存储库中。

当composer完成安装后,它会将所有软件包及其下载的确切版本写入composer.lock文件,将项目锁定到这些特定版本。您应该将composer.lock文件提交到项目仓库,以便所有在项目上工作的人都被锁定到相同版本的依赖项(下面更多)。

用 安装composer.lock

这将我们带到第二种情况。如果在运行时已存在composer.lock文件和composer.json文件composer install,则表示您install之前运行该命令,或者项目中其他人运行该install命令并将该composer.lock文件提交到项目(这很好)。

无论哪种方式,install当composer.lock文件存在时运行会解析并安装您列出的所有依赖项composer.json,但composer会使用列出的确切版本composer.lock来确保程序包版本对于处理项目的每个人都是一致的。因此,您将拥有composer.json文件请求的所有依赖项,但它们可能并非都是最新的可用版本。这是设计的,它确保您的项目不会因为依赖项的意外更改而中断。

将composer.lock文件提交到版本控制

将此文件提交给VC非常重要,因为它会导致设置项目的任何人使用您正在使用的完全相同的依赖项版本。您的CI服务器,生产计算机,团队开发中其他的开发人员,所有的人和每个人都运行相同的依赖关系,从而减少了仅影响部署的某些部分的错误的可能性。即使您单独开发,在重新安装项目的六个月内,即使您的依赖项从那时起发布了许多新版本,您任然可以确信所安装的依赖项任然有效。(请参阅下面有关使用update命令的说明。)

将依赖项更新为其最新版本

如上所述,该composer.lock文件阻止您自动获取最新版本的依赖项。要更新到最新版本,请使用该update命令。这将获取最新的匹配版本(根据您的composer.json文件)并使用新版本更新锁定文件。(这相当于删除composer.lock文件并install再次运行。)

php composer.phar update

注意:install如果composer.lock由于对composer.json可能影响依赖项解析的更改而未更新,则composer将在执行命令时显示警告。

如果您只想安装或者更新一个依赖项,可以将它们列入白名单:
php composer.phar update monolog/monolog

注意:对于库,不必提交锁定文件。

Packagist

Packagist是composer的主要存储库。composer存储库基本上是一个包源:一个可以从中获取包的地方。Packagist意在成为每个人都使用的中央存储库。这意味着您可以自动使用require任何可用的包,而无需进一步指定composer应查找包的位置。

如果您访问Packagist网站(packagist.org),您可以浏览并搜索包。

建议使用composer的任何开源项目在Packagist上发布它们的包。库不需要在Packagist上供composer使用,但它可以更快地发现和采用其他开发人员。

平台包

composer具有平台包,这些包是安装在系统上但实际上不能由composer安装的虚拟包。这包括PHP本身,PHP扩展和一些系统库。

- php表示用户的PHP版本,允许您应用约束,例如^7.1.要求64位版本的PHP,您可以要求php-64bit包。
- hhvm表示hhvm运行时的版本,并允许您应用约束,例如^2.3.
- ext-<name>允许您需要PHP扩展(包括核心扩展)。版本控制在这里可能非常不一致,因此将约束设置为通常是个好主意*。扩展包名称的示例是ext-gd。
- lib-<name>允许对PHP使用的库版本进行约束。以下是可供选择:curl,iconv,icu,libxml,openssl,pcre,uuid,xsl。

您可以使用show --platform获取本地可用平台包的列表。

自动加载

对于指定自动加载信息的库,composer会生成一个vendor/autoload.php文件。您可以简单地包含此文件并开始使用这些库提供的类,而无需任何额外的工作:

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

$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\SreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');

您甚至可以通过添加autoload字段将自己的代码添加到自动装带器中composer.json。

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

composer将为命名空间注册PSR-4自动加载器Acme。

您可以定义从名称空间到目录的映射。该src目录将位于项目根目录中,与vendor目录位于同一级别。示例文件名将src/Foo.php包含一个Acme\Foo类。

添加autoload字段后,必须重新运行dump-autoload才能重新生成vendor/autoload.php文件。
包含该文件也将返回自动加载器示例,因此您可以将include条用的返回值存储在变量中并添加更多名称空间。例如,这对于在测试套件中自动加载类非常有用。

$loader = require DIR . '/vendor/autoload.php';
$loader->addPsr4('Acme\Test\', DIR);

除了psr-4自动加载外,composer还支持psr-0,类映射和文件自动加载。有关autoload更多信息,请参阅参考。

另请参阅有关优化自动装载器的文档。

注意:composer提供自己的自动加载器。如果您不想使用该vendor/composer/autoload_*.php文件,则可以包含文件,这些文件关联数组允许您配置自己的自动加载器。