“content-hash”是composer.lock的必备部分吗?

时间:2017-09-12 21:43:55

标签: composer-php

与大多数人写{和阅读'关于whether to keep composer.lock in version-control的问题一样,我们一直在那里。

然而,每次在不同的代码分支中独立更新文件时,这都会给我们带来麻烦。即使更改不相关并且会相互影响文件的各个部分,"content-hash"行每次都会导致冲突 。更糟糕的是,“侧面”都不正确,无论谁进行合并,都必须手动重新生成文件......

也许,这条线不是真的有必要吗?在询问之前,是否(当前版本的)作曲家在没有它的情况下工作,会缺少什么功能?哈希似乎可以防止文件本身发生变化 - 但源控制系统已经在做了......

我可以简单地删除该行吗?如果今天无法完成,那么它是作曲家的理想功能吗?

1 个答案:

答案 0 :(得分:24)

内容哈希的目的

正如您在Composer\Package\Locker::getContentHash()中所看到的,内容哈希考虑了composer.json的以下字段:

$relevantKeys = array(
    'name',
    'version',
    'require',
    'require-dev',
    'conflict',
    'replace',
    'provide',
    'minimum-stability',
    'prefer-stable',
    'repositories',
    'extra',
);

内容哈希更改的唯一原因是更改了composer.json中相应属性的值之一。

Composer使用内容哈希来确定composer.json中的相关字段是否与composer.lock同步。你可以运行

$ composer validate

了解它们是否同步。

如果composer.jsoncomposer.lock未同步,则会显示与此类似的消息

  

锁定文件与composer.json中的最新更改不是最新的,建议您运行composer update

供参考,请参阅https://getcomposer.org/doc/03-cli.md#validate

  

在提交composer.json文件之前以及标记版本之前,应始终运行validate命令。它会检查您的composer.json是否有效。

解决composer.lock

中的冲突

如果您在解决composer.lock中的冲突时遇到问题,可能会有所帮助:

步骤1:接受上游变更

通常,您可能会尝试在上游更改之上重新绑定分支。如果已经发生冲突,请使用IDE,或运行

$ git checkout --theirs composer.lock

接受composer.lock的上游更改。由于这是一个生成的文件,因此您真的不想解决其中的冲突。

第2步:将更改重新应用于composer.jsoncomposer.lock

如前所述,composer.json中有一系列相关的关键字。其中一些可以通过相应的命令修改,其他则不能。

例如,如果其中一个更改是新添加或删除的包,请运行

$ composer require foo/bar:^1.2.3

$ composer remove foo/bar

应用更改。

如果通过运行命令无法应用更改,请手动修改composer.json,然后运行

$ composer update --lock

这将更新内容哈希。

供参考,请参阅https://getcomposer.org/doc/03-cli.md#update

  

- lock :仅更新锁定文件哈希以禁止警告锁定文件过期。