我正在尝试执行composer update <package>
但收到以下错误:
请求的包<包>(锁定在
,需要<版本>( 可以通过 包>[ 版本>] 来满足,但这些冲突 根据您的要求或最低稳定性。
同时,标签<tag>
仅作为字符串存在于我的 composer.lock 文件中,我认为该文件仅由composer update
修改,而不是读回。
我尝试运行composer why-not <package>
,但它的输出并没有真正解释这个问题:
<程序> <其他版本>需要<包>(<版本>(版本>包>其他版本> 程序>
在这种情况下,"锁定在"是什么意思,我该如何解决问题?
包被锁定意味着在上次运行锁定文件中composer update
期间,与版本约束一起使用的分支上最后一次提交的提交哈希dev-<branch>
被保存,以确保在部署时确定性(可重现(构建。
此提交哈希或标记将写入您的锁定文件 (composer.lock
( 如果您:
- 运行
composer update [<package>]
。或。。。
- 运行
composer install
,composer.json
存在,但在作曲家的当前目录中没有锁定文件,它会自动生成锁定文件
当您指定要composer update
的软件包名称时(例如composer update somevendor/somepackage
(,您告诉 Composer 您要更新该包并将其他所有内容保留为当前版本- 您希望将所有其他包"锁定"在它们所在的位置,然后只更新一个。
仅当您指定的软件包的新版本与已安装的软件包兼容时,这才有效。如果新版本需要其他内容的较新版本,或者列出它与特定版本"冲突",Composer 只会告诉您它无法做到这一点。
其他包"锁定"的版本存储在composer.lock
文件中,但切勿手动编辑该文件。
您可以通过几种方式告诉 Composer 允许更新哪些包:
- 一次更新多个特定程序包以解决特定问题:
composer update somevendor/somepackage somethingelse/somedependency
- 更新选定的包及其所有依赖项,但直接在 composer.json 中列出的依赖项除外:
composer update somevendor/somepackage --with-dependencies
- 更新所选包及其所有依赖项:
composer update somevendor/somepackage --with-all-dependencies
- 只需更新所有内容:
composer update
完全没有参数
所有这些命令仍将遵循您在composer.json
中手动指定的版本约束,您只需在命令行上向 Composer 提供关于允许更新哪些包以满足这些约束的其他说明。
就个人而言,我主张只运行没有参数的composer update
:如果您想更严格地控制何时更新某些内容,您可以随时在composer.json
中列出更具体的约束。