composer.json 项目安装
所有的依赖都定义在 composer.json 中,在项目中创建一个 composer.json 文件,在文件中指定 require 的值来告诉 Composer 你的项目需要依赖哪些包
{"require": {"monolog/monolog": "1.0.*"}}
上例中,monolog/monolog 是包的名称,1.0.* 是包的版本。
包名称
包名称由供应商名称和其项目名称构成。通常容易产生相同的项目名称,而供应商名称的存在则很好的解决了命名冲突的问题。它允许两个不同的人创建同样名为 json 的库,而之后它们将被命名为 igorw/json 和 seldaek/json 。
包版本
在前面的例子中,我们引入的 monolog 版本指定为 1.0.* 。这表示任何从 1.0 开始的开发分支,它将会匹配 1.0.0 、1.0.2 或者 1.0.20。
版本约束可以用以下几个不同的方法来指定:
| 名称 | 实例 | 描述 |
|---|---|---|
| 确切的版本号 | 1.0.2 |
指定包的确切版本。 |
| 范围 | >=1.0 >=1.0,<2.0 >=1.0,<1.1|>=1.2 |
通过使用比较操作符可以指定有效的版本范围。 有效的运算符:>、>=、<、<=、!= 。还可以定义多个范围:用逗号隔开,表示一个逻辑 AND 。用 | 隔开表示逻辑 OR 。AND 的优先级高于 OR。 |
| 通配符 | 1.0.* |
1.0.* 与 >=1.0,<1.1 是等效的。 |
| 赋值运算符 | ~1.2 |
~1.2 相当于 >=1.2,<2.0。~1.2.3 相当于 >=1.2.3,<1.3 |
| 赋值运算符 | ^1.2 |
^1.2 相当于 >=1.2,<2.0。^1.2.3 相当于 >=1.2.3,<2.0.0 |
install 命令,安装依赖
执行 composer install 命令,Composer 会读取 composer.json ,查找并下载满足条件的最新的依赖,并把安装时确切的版本号列表写入 composer.lock 文件。
当你本地如果已经存在一份 composer.lock 时,它将会去读取你的 composer.lock 而非 composer.json ,并且以此为标准去下载依赖。
update 命令,更新依赖
执行 composer update 命令,Composer 会读取 composer.json (不管本地有没有composer.lock 文件),查找满足条件的最新的依赖,如果本地没有 composer.lock 文件,或者查找到的依赖版本高于 composer.lock 文件记录的版本,则更新本地的依赖。
如果你不希望影响别的已经安装的依赖,仅仅更新你修改的部分,那你可以通过指定白名单来确定要更新的范围,例如 composer update monolog/monolog 仅会更新 monolog/monlog 这个依赖,别的依赖哪怕有更新也会被忽略
require 命令,安装或更新依赖
require 命令增加或更新依赖包。如果还没有 composer.json 文件,会自动生成,如果依赖已存在,则会更新。
require 命令可以通过交互的方式指定依赖包:
composer require#根据提示搜索包、选择包、输入版本号#输入版本号并回车后,会继续提示“Search for a package:”,如果需要添加其他包,重复上述步骤,如果不需要添加其他包,则回车开始执行添加。
也可以直接指定依赖包及其版本:
composer require monolog/monolog:1.24.*
install、update 和 require 的对比总结
composer.lock 文件影响 install 和 update 的行为。
| 命令 | composer.lock 文件 |
操作 |
|---|---|---|
| install | 无 | 安装 composer.json 中的依赖,并生成 composer.lock 文件 |
| update | 无 | 安装 composer.json 中的依赖,并生成 composer.lock 文件 |
| install | 有 | 安装 composer.lock 中的依赖 |
| update | 有 | 读取 composer.json 中的依赖,并尝试更新符合条件的最新版 |
如果你把 composer.lock 纳入项目的版本控制中,那么你就可以确保你项目中的每一个人、每一台电脑,不管什么系统,都能拉取到一模一样的依赖,以减少潜在的依赖对部署的影响。当然,请记得,你应该使用的命令是 composer install。
composer.json 文件影响 require 的行为
| 命令 | composer.json 文件 |
操作 |
|---|---|---|
| require | 不存在 | 安装扩展包,并生成 composer.json 和 composer.lock 文件 |
| require | 文件存在但没有扩展包 | 增加新的扩展包,并写入 composer.json 和 composer.lock 文件 |
| require | 文件存在且已有扩展包 | 更新扩展包,并写入 composer.json 和 composer.lock 文件 |
remove 命令,移除依赖
composer remove monolog/monolog
自动加载
对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件。需要引入这个文件
require 'vendor/autoload.php';
例如:如果你的项目依赖 monolog,你就可以像这样开始使用这个类库,并且他们将被自动加载。
$log = new Monolog\Logger('name');$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));$log->addWarning('Foo');
也可以在 composer.json 的 autoload 字段中增加自己的 autoloader。
{"autoload": {"psr-4": {"Acme\\": "src/"}}}
Composer 将注册一个 PSR-4 autoloader 到 Acme 命名空间。
添加 autoload 字段后,你应该再次运行 composer install 命令来生成 vendor/autoload.php 文件