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