Composer学习笔记

#Composer学习笔记

一、安装(MacOS)

系统要求:PHP5.3.2+以上版本
学习参考:Composer官方文档

Composer安装分两种:

1.局部安装

composer.phar文件内嵌于PHP应用目录下,命令如下:

1
2
3
4
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === 'e115a8dc7871f15d853148a7fbac7da27d6c0030b848d9b3dc09e2a0388afed865e6a3d6b3c0fad45c48e2b5fc1196ae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

以上命令分别做如下几件事件:

  • 下载安装器
  • 校验
  • 执行安装
  • 删除安装器

安装完成后,会在当前工作目录下生成可执行文件:composer.phar,你可以通过如下方式使用(运行)composer来进行项目的依赖管理:

1
2
php composer.phar <command>
# command指install等composer命令

2.全局安装

将可执行二进制文件放在系统PATH路径下,命令如下:

1
2
3
4
# 假设局部安装中生成的composer.phar文件在当前目录下
# /usr/local/bin/目录是一个现成的PATH目录,
# 你也可以将可执行文件放置于其他PATH目录下
mv composer.phar /usr/local/bin/composer

通过这种方式,你就可以直接按如下方式来使用composer:

1
2
composer <command>
# command指install等composer命令

二、基本概念

1. composer.json文件

每个基于Composer的项目都需要包含composer.json文件,该文件用于声明项目所依赖的第三方库,其为JSON文件,格式类似:

1
2
3
4
5
{
"require": {
"monolog/monolog": "1.2.*"
}
}

require属性是用于声明依赖信息的地方。

当运行composer install安装依赖时,Composer会将依赖库下载到项目根目录的vendor目录下。如monolog依赖安装后,其存放在vendor\monolog\monolog目录下。

2. composer.lock文件

当执行如下命令安装依赖后,Composer将会在项目目录下创建composer.lock文件。

1
composer install

Composer将把安装时确切的版本号列表写入composer.lock文件。这将锁定改项目的特定版本。
后续再次运行composer install时,Composer将先检查目录下是否有composer.lock,若有则直接忽略composer.json,而使用composer.lock中的确切的版本信息。团队成员可以共享该lock文件以解决版本不一致问题。
当依赖版本有升级时,若想更新依赖至最新版本可以运行如下命令

1
2
3
4
# 全部更新
composer update
# 只更新某个依赖库
composer update monolog/monolog [...]

3. 自动加载

对于库的自动加载信息,Composer 生成了一个vendor/autoload.php文件。通过引入这个文件,就实现了自动加载功能。

1
require 'vendor/autoload.php';

通过自动加载功能我们可以很容易的使用第三方代码。例如:项目依赖monolog,我们就可以像这样开始使用这个类库,并且他们将被自动加载。

1
2
3
4
$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));

$log->addWarning('Foo');

当然,我们也可以在composer.jsonautoload字段中增加自己的autoloader

1
2
3
4
5
{
"autoload": {
"psr-4": {"Acme\\": "src/"}
}
}

Composer将注册一个PSR-4 autoloaderAcme命名空间。

你可以定义一个从命名空间到目录的映射。此时src会在你项目的根目录,与vendor文件夹同级。例如src/Foo.php文件应该包含Acme\Foo类。

添加autoload字段后,你应该再次运行install命令来生成 vendor/autoload.php文件。

引用这个文件也将返回autoloader的实例,你可以将包含调用的返回值存储在变量中,并添加更多的命名空间。这对于在一个测试套件中自动加载类文件是非常有用的,例如:

1
2
$loader = require 'vendor/autoload.php';
$loader->add('Acme\\Test\\', __DIR__);

三、库

不重复造轮子,这是大伙天天喊的,因为社区已经为大伙提供了很多可直接引用的轮子,这些轮子的学名就叫“库”。如果你觉得自己的项目可以帮到别人,你可以选择将其打包成库,并大告天下。你只要按如下步骤操作就行:

  1. 为项目的composer.json添加name属性 [必需]
  2. 发布至git等版本管理系统或packagist
  • composer.json中还有一个version属性,但一般不建议设置,因为composer会根据tag标签自行推算版本号,如果项目代码为master,则版本会被推算为dev-master
  • packagist可理解为一个公共的组件仓库,类似maven中央库
  • 对于未发布至packagist库的组件,引用方需要指定repositories

比如,假如我们将项目发布至Github下,项目的composer.json如下:

1
2
3
4
5
6
{
"name": "simiam/composer-demo",
"require": {
"monolog/monolog": "1.0.*"
}
}

接下来,我们的另一个项目blog需要引用上面发布的simiam/composer-demo组件,则blog项目的composer.json内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
{
"name": "simiam/blog",
"repositories": [
{
"type": "vcs",
"url": "https://github.com/monkeychen/simiam"
}
],
"require": {
"simiam/composer-demo": "dev-master"
}
}

因为我们发布的是master分支,所以require中依赖的版本号为dev-master
如果组件已经发布至packagist的话,则不需要声明repositories,因为composer默认会从中央库中搜索。

更详细的信息,可以参考这里

转载请注明出处:cloudnoter.com