永远不要在制作中运行'composer update'为什么?

Jes*_*on 9 php composer-php

composer install将在composer.lock文件中声明时安装,但composer update将更新所有依赖项并根据所需内容创建 composer.lock文件composer.json.

这么多说只是composer update在开发中运行.但我的问题是做composer update了更换旧composer.lock文件,如果你的应用程序要打破它会破坏,因为可能与新更新的依赖项有冲突.

我遇到了一个必须要做的情况composer update,问题与​​pcntl扩展有关.唯一的解决方案是pcntl 安装PHP pcntl模块

我不明白为什么人们害怕这样做composer update.

Olu*_*kin 9

我对此的想法是,

  • 系统的当前工作状态非常重要,因为我认为已经针对它运行了一些测试.
  • 要做作曲家更新意味着,作为应用程序一部分的库会有更新,这可能会导致系统崩溃.因为它们是依赖于依赖库的库的库.
  • 最后,如果composer-update需要,我宁愿这样做:
    • 在开发环境中结账composer update,
    • 确保在开发环境中对应用程序进行全面测试
    • 然后安装在live/production上 composer install

  • @JessicaRobertson - 是的,当你想使用composer update时,你应该进行全面的测试; 你应该在任何部署之前进行全面的测试; 你应该为这个目的进行自动化测试 (5认同)
  • 意味着每次当你想要更新作曲家时都必须进行全面的测试? (2认同)

yiv*_*ivi 6

TLDR;

不要运行,composer update也不要composer install在生产中。在其他地方执行它,然后将结果上传到生产环境。但是,如果您必须执行以下任一操作:始终运行install并创建全新安装;永不updateinstall更加可预测和可靠,而update您则受项目任何依赖项的支配。


Composer以递归方式工作。因此,即使您在中具有非常严格的版本约束composer.json,通过运行,composer update您不仅将更新依赖关系,还将更新依赖关系的依赖关系。

尽管在大多数情况下这不会造成损坏,但有时会造成损坏。一行中的依赖项可能会导致行为更改,从而可能以您未测试的方式影响代码。

而且,它基本上是在使用错误的工具来完成工作。Composer是依赖性管理工具,而不是部署工具。要将代码部署到生产环境,您应该使用某种代码部署工具(即使该“工具”就像FTP上传和几个脚本一样简单)。

适当的流程是:

  • 在开发机器上执行所有requireupdate调用,在这里您可以毫无风险地测试项目。这会生成一个composer.lock,这是整个项目的已知状态,具有离散的安装版本。
  • 创建一个新的可安装版本install --no-dev。在这一步上,您还应该转储经过优化的自动装带器,运行安装后脚本等。我通常将其分为多个步骤:

    1. composer install --prefer-dist --no-scripts --no-progress --no-suggest --no-interaction --no-dev

      ^^这是对所有内容的完整,无提示安装,但不包括开发依赖项。

    2. composer dump-autoload --optimize --no-dev

      ^^转储适合生产的优化自动装带器脚本。

    3. composer run-script --no-dev post-install-cmd

      ^^这主要用于Symfony,但是,如果您要运行任何安装后脚本(例如,将资产复制到“ public”目录中,预热某种​​类型的缓存,诸如此类),这将是个好时机去做吧。

  • 应当测试上述步骤的结果(通常在过渡环境中),然后将其推送到整个生产环境(您的客户代码,供应商文件夹,针对产品量身定制的配置等);使用您喜欢的任何部署方法。

  • @Čamo 我想我在上一条评论中解释了答案。再说一遍,这不是“composer install”的“问题”,而是它不是完成这项工作的正确工具。我不明白你关于“生产充满命令”的评论。抱歉你不同意,我认为你错了,随着时间和经验的推移,你会明白这一点。但与此同时,只要使用对你有用的东西即可。这就是我们最终所做的。再见! (2认同)