以下是我们的情况:
我们有3个不同的Laravel项目,所有3个项目都依赖于我们的Core项目。 这个Core项目是一个单独的Laravel包,托管在我们的私有仓库上,用作其他项目的依赖项。
之前,只要Core项目中的某些内容发生变化,我们就会在每个项目的服务器上运行一个作曲家更新myvendor / ourcorepackage来引入核心变化。然而,最近当我们尝试在512 MB Ram的数字海洋登台环境中运行更新时,作曲家似乎遇到了严重的内存问题。请参阅:https://github.com/composer/composer/issues/1898
我经常遇到的解决方案是人们说你应该总是在生产服务器上运行composer install。我可以在安全性方面与此相关,因为如果您更新到可能会破坏您的代码的某些第三方软件包的新版本,则可能会很危险。但在我们的情况下,我们只更新自己的核心包,因此我们知道我们正在做什么,但是这个内存问题迫使我们使用composer install方法,因为它对内存的要求较低。
所以基本上这是我们当前的工作流程:
当我们的核心软件包发生变化时,我们需要运行一个作曲家 更新每个项目的ourvendor / ourpackage LOCALLY这会生成一个 composer.lock文件
我们在repo中提交composer.lock文件
在每个项目的服务器上,我们运行git pull并运行一个composer 安装。这只会更新我们的核心软件包并且运行速度更快 并且没有与作曲家更新相关的内存问题
然而,这个解决方案提出了两个问题:
那我该怎么办呢?在拉动服务器之前删除composer.lock文件? 我们应该如何处理composer.lock文件的合并冲突?
令人遗憾的是,作曲家更新会遇到内存问题,因为这种方法似乎更合乎逻辑。只需使用composer.lock文件更新您想要的包而不用麻烦..
请告知如何在我们的案例中使用GIT和作曲家的正确工作流程以及如何解决上述冲突?
非常感谢你的意见
答案 0 :(得分:11)
如果开发人员不自行执行此步骤,您如何测试核心更新(或任何其他已更新的依赖项)是否会破坏使用它的项目中的内容?
这就是为什么通常的工作流期望composer update
在具有足够RAM的开发机器上运行(即可能超过1GB设置为PHP的内存限制),并且更新应该由开发人员手动触发(如果通过持续集成构建自动触发,则内存要求也适用于此机器。
无法满足此内存要求。安装了512 MB RAM的Web服务器可能可以作为临时服务器,几乎没有任何并发用户,但不应该用它来更新Composer依赖项。
我个人使用一个非常简单的系统修复composer.lock
中的合并冲突:删除锁定文件并运行composer update
。这将更新所有依赖于满足版本要求的最新版本,并创建一个在合并期间提交的新的composer.lock
文件。
我不害怕可能更新所有内容,因为它可以按预期工作,或者我的测试会很快发现错误。
我确实选择了我谨慎使用的第三方套餐:
这适用于我们当地的Satis实例提供的大约270个软件包(在尝试减少内存占用时可能也是一个需要考虑的因素 - 只有Composer知道的软件包最终会在内存中:比较packagist上可能提供的一万个软件包.org有270个本地包)。 270个包装由270个开发人员在本地开发,并随机发布新版本。过去两年中的更新失败非常罕见,应该像其他错误一样处理:如果检测到标记版本不兼容,我们会发布恢复更改的错误修正版本,并使用新的主要版本标记原始更改,如果必须进行不兼容的更改。
所以你要求的工作流程可能是这样的:
composer update
。composer.lock
文件在内的更改提交给Git composer install
,并且将使用开发人员在其计算机上使用的版本。将已提交的版本合并到其他开发者计算机上可能会显示与composer.lock
的合并冲突。
composer.lock
文件。composer update
。答案 1 :(得分:2)
另一种方法(不做composer update
):
composer.json
复制到单独的文本文件中。composer.json
和composer.lock
文件。composer install
composer require vendor/package:version
composer remove vendor/package
此方法将保持远程分支(可能是master
或develop
分支)的锁定,并且只更新新的包。
答案 2 :(得分:0)
有时候composer update
可能会破坏事情。
我要做的是。
composer.lock
的所有更改composer.json
composer install
,以便根据composer.lock
安装软件包。composer require vendor/package
添加了该软件包;如果已删除,则添加composer remove vendor/package
。
如果有多个软件包,它将从composer.json