我想创建自己的包管理器,目前正在查看现有的解决方案。
我现在正在使用PHP的Composer,它有两个文件,这是非常令人惊讶的:
composer.json
用于项目配置和非固定依赖项
composer.lock
了解确切的固定依赖关系
我确实理解为什么需要引入依赖关系,.lock
信息本身对我来说似乎是合乎逻辑的。
我不明白为什么项目元数据被分成两个文件。
任何人都可以解释,为什么它是这样设计的?为什么deps无法固定在composer.json
?
UPD。事实证明,Rust' s Cargo具有相同的两个文件配置,并且对.lock
文件的含义有一个很好的解释:http://doc.crates.io/guide.html#cargotoml-vs-cargolock
答案 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
进行部署