Composer php 是";内容散列“;composer.lock的必选部分?

Composer php 是";内容散列“;composer.lock的必选部分?,composer-php,Composer Php,就像大多数人写(和读)问题一样,我们把自己的问题保留在那里 但是,每当文件在不同的代码分支中独立更新时,这会给我们带来麻烦。即使更改是不相关的,并且远远影响文件的各个部分,“content hash”行每次都会导致冲突。更糟糕的是,这两个“边”都不正确,任何进行合并的人都必须手动重新生成文件 也许,这条线真的不必要?在询问(当前版本的)composer是否可以在没有它的情况下工作之前,会缺少哪些功能?散列似乎可以防止文件本身发生变化——但源代码管理系统已经在这样做了 我可以简单地删除该行吗?若今

就像大多数人写(和读)问题一样,我们把自己的问题保留在那里

但是,每当文件在不同的代码分支中独立更新时,这会给我们带来麻烦。即使更改是不相关的,并且远远影响文件的各个部分,
“content hash”
行每次都会导致冲突。更糟糕的是,这两个“边”都不正确,任何进行合并的人都必须手动重新生成文件

也许,这条线真的不必要?在询问(当前版本的)composer是否可以在没有它的情况下工作之前,会缺少哪些功能?散列似乎可以防止文件本身发生变化——但源代码管理系统已经在这样做了

我可以简单地删除该行吗?若今天不能完成,这对作曲家来说是一个理想的功能吗?

内容哈希的目的 如中所示,内容哈希考虑了
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.json
composer.lock
不同步,将显示类似的消息

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

有关参考,请参阅:

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

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

步骤1:接受上游变更 通常,您可能会尝试在上游更改的基础上重新设置分支的基础。当已经发生冲突时,请使用IDE,或运行

$ git checkout --theirs composer.lock
接受对
composer.lock
的上游更改。因为这是一个生成的文件,所以您确实不想解决其中的冲突

步骤2:将更改重新应用到
composer.json
composer.lock
正如前面指出的,在
composer.json
中有一系列相关的键。其中一些可以通过相应的命令进行修改,其他则不能

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

$ composer require foo/bar:^1.2.3

以应用更改

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

$ composer update --lock
这将更新内容哈希

有关参考,请参阅:

--lock:仅更新锁文件哈希,以抑制有关锁文件已过期的警告


哈,很高兴在这里见到你,米哈伊尔!谢谢您的答案似乎表明,
composer.lock
毕竟不应该被检查到源代码管理中——因为它是一个人工制品,而不是人类编码的文件……当然,这取决于您想要实现什么。对于应用程序,我总是希望签入
composer.lock
。这确保了每次在每个环境中运行
composer安装
时都会安装完全相同的依赖项(除非不满足平台要求,否则将不安装任何内容。不签入
composer.lock
并运行
composer install
与运行
composer update
具有相同的效果(假设不存在
composer.lock
)。这可能会产生不希望出现的后果,因为可能会安装不同版本的软件包。对于库,您可以签入
composer.lock
,但通常,您希望确保库与一系列版本一起工作,而不是与当前固定到的版本一起工作。然后,您通常针对最低和最高版本运行生成ns.如果您随后签入
composer.lock
,您还可以针对固定在
composer.lock
中的版本集运行构建。平台要求也可以在
composer.json
中指定,请参阅。同样,不签入
composer.json
会带来破坏性更改的风险。这可能会导致(这在Refinery29中发生过),即使在使用sane版本要求时,甚至在包维护人员声称遵循语义版本控制时(请参阅)。看起来,
composer.json
中没有正确地指定要求,应该签入它。但是从中派生出来的
composer.lock
,没有……当然,事故已经发生了,并且将继续发生。。。
$ composer update --lock