为什么composer被设计为使用两个文件:composer.json和composer.lock,而不是一个

时间:2016-09-10 18:02:06

标签: php composer-php

我想创建自己的包管理器,目前正在查看现有的解决方案。

我现在正在使用PHP的Composer,它有两个文件,这是非常令人惊讶的:

  • composer.json用于项目配置和非固定依赖项

  • composer.lock了解确切的固定依赖关系

我确实理解为什么需要引入依赖关系,.lock信息本身对我来说似乎是合乎逻辑的。

我不明白为什么项目元数据被分成两个文件。

任何人都可以解释,为什么它是这样设计的?为什么deps无法固定在composer.json

UPD。事实证明,Rust' s Cargo具有相同的两个文件配置,并且对.lock文件的含义有一个很好的解释:http://doc.crates.io/guide.html#cargotoml-vs-cargolock

2 个答案:

答案 0 :(得分:3)

在开发过程中,您通常希望能够轻松地升级到最新的兼容版本的依赖项。 composer.json包含有关依赖项的信息以及哪些版本兼容。 composer.lock缺少兼容性信息,可能会说该软件包是针对依赖版本2.2.7构建的,但缺少有关规则的信息,例如版本> = 2.1和<其中3个兼容性兼容,而较低版本则不兼容,下一个主要版本不保证是安全的。

另一方面,在构建测试或发布时,有必要确保每次都针对完全相同的依赖版本进行构建。 composer.lock允许列出所用的确切版本。即使新版本的依赖项出现,依赖项固定也会确保构建不会发生变化,因此您不必担心依赖包中的更改导致的行为更改。

答案 1 :(得分:2)

.lock信息绝对固定,通常由基于composer update信息的json请求创建...但开发人员不一定要将所有内容固定为精确版本,如果没有.json文件,他们必须手动升级.lock文件,以便为其依赖项的每个版本升级。

.lock还包含依赖项的依赖项,依赖项依赖项的依赖项等......而.json文件只保存直接依赖项....作为开发人员,您应该只需要控制您的直接依赖项,并允许这些库通过自己的.json文件控制自己的依赖项

基本上,您应该针对json构建应用程序,但针对.lock进行部署