当前位置: 首页 > 知识库问答 >
问题:

为什么我不应该在生产中运行“composer update”?

宗政德宇
2023-03-14

作曲家安装将在composer.lock文件中说明的任何时候安装,但是作曲家更新将更新所有的依赖关系,并根据是什么创建一个新的composer.lock文件需要在composer.json

所以很多人说只在开发中运行composer update。但是我的问题是做composer更新确实替换了旧的composer。锁定文件,如果你的应用程序要中断,它将中断,因为可能与新更新的依赖项冲突。

我遇到了一种情况,我必须执行composer更新,这个问题与pcntl扩展有关。唯一的解决方案是进行composer更新PHP-pcntl模块安装

我不明白为什么人们害怕在生产中运行composer update

共有3个答案

司马渝
2023-03-14

我的想法如下:

你不应该在没有参数的情况下使用作曲家更新。

composer update读取composer上列出的每个包。json,并将其更新为与指定版本约束兼容的最新可用版本。

在一个完美的世界里,所有的图书馆都将正确地遵循Semver,它不应该有任何副作用。但是从技术上讲,这并不总是正确的,你可以下载一个与前一个版本不兼容的版本,或者只是一个有未更正错误的版本。

所以,一次更新你所有的包可能会导致一些问题,除非你有时间检查你网站上的所有东西,以确保没有出错。

但是,当然,您有时必须更新特定的包,因此使用composer update xxx/xxx非常有用,前提是您要检查包的所有实现。

当更新的软件包经过全面测试后,您可以将代码提交到登台/生产,然后运行composer安装,以确保在所有平台上都有相同版本的软件包和依赖项。

长话短说,以下是我使用的流程:

  • composer要求xxx/xxx安装新软件包
  • composer update xxx/xxx更新特定软件包
  • composer在安装软件包时在所有环境上安装。锁定文件已更新

其他想法

我曾经偶然发现一个实现,它可以在composer.json.中给出包的确切版本。开发人员解释说,这样你就可以在没有损坏的情况下使用作曲家更新

我不同意这个选项,因为即使使用composer中的确切版本。json,依赖项是不固定的,编写器更新可能会导致其中的潜在错误。

庾勇军
2023-03-14

我的想法是,

  • 系统的当前工作状态非常重要,因为我假设已经对它进行了一些测试。
  • 执行作曲家更新意味着,作为应用程序一部分的库会有更新,这可能会导致系统崩溃。因为它们是依赖于依赖于图书馆的图书馆。
  • 最后,如果需要作曲家-更新,我宁愿这样做:
    • 签出一个开发环境和作曲家更新
    • 确保应用程序在开发环境上进行了彻底测试
    • 然后安装在live/生产与作曲家安装

衡子安
2023-03-14

请勿在生产中运行composer updatecomposer install。在其他地方执行,并将结果上载到生产服务器,但不要上载到承载应用程序的同一目录。作为一般规则,您不应该在服务的同时修改正在服务的应用程序。创建应用程序的另一个副本,当它准备好时,用最接近即时的命令替换它(例如mvln-s)。

但是如果你必须运行其中任何一个:总是运行安装并创建一个新的安装;永远不要更新。项目的依赖关系。

作曲家递归工作。因此,即使您的composer.json中有非常严格的版本约束,通过运行作曲家更新,您不仅要更新依赖项,还要更新依赖项的依赖项。

虽然大多数情况下这不会导致破损,但有时会。一个依赖关系可能会导致行为的改变,这可能会以您没有测试过的方式影响您的代码。

此外,它基本上使用了错误的工作工具。Composer是一个依赖管理工具,而不是部署工具。要将代码部署到生产环境,您应该使用某种代码html" target="_blank">部署工具(即使该工具像FTP上传和几个脚本一样简单)。

适当的流程是:

  • 在您的开发机器上执行所有的要求更新调用,在那里您可以无风险地测试项目。这将生成一个composer.lock,这是整个项目的已知状态,具有离散的安装版本。
  • 创建一个新的可安装版本,执行安装--no-dev。在这一步中,您还应该转储优化的自动加载程序,运行安装后脚本等。我通常将此分开不止一步:

>

  • composer安装--首选dist--无脚本--无进度--无建议--无交互--无开发

    ^^这是一个完整的静默安装,不包括开发依赖项。

    composer转储自动加载--优化--无开发

    ^^要转储适合生产的优化自动加载器脚本。

    composer运行脚本--无dev-post-install cmd

    ^^这主要是针对Symfony的,但如果您有任何安装后脚本要运行(例如,将资产复制到“公共”目录,预热某种类型的缓存,诸如此类),这将是一个很好的时机。

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

    请注意,如果使用任何“慢速”推送方法(FTP、copy、rsync等),则不应直接写入应用程序文件系统,而应创建应用程序的新副本,一旦文件传输就绪,请使用快速方法将“生产”替换为新版本。一种流行且有效的方法是使用符号链接作为“生产”根目录,因此您只需在完成上述所有操作并准备就绪后更新符号链接,而不会影响正在运行的应用程序(否则可能会由于突然包含属于应用程序不同版本的文件而暂时中断)。

  •  类似资料:
    • 我的老师让我这样做,但在评论区我被告知我不应该这样做。 为什么?

    • 问题内容: 当我编译spring mvc应用程序时,我在输出中得到了这个: 我指的是在生产中应该使用什么? 问题答案: Tomcat本地版本是使用高度优化的Apache可移植运行时(APR)的Tomcat版本,该框架是为Apache HTTP服务器提供支持的相同框架。

    • 问题内容: 当我读一本Java书籍时,作者曾说过,在设计类时,与继承一起使用通常是不安全的。例如: 在上面的类中,我们应放置,以便其他类不能从此继承。我的问题是,为什么允许另一个类从中继承是不安全的? 问题答案: 因为很难(不可能?)做到正确,尤其是 对称 属性 。 说你有一堂课。产生如果参数也是并且具有相同的重量。如果要实现,则仅当参数也是汽车(重量除外)时,它才应屈服,并且还应比较制造商,发动

    • 问题内容: 为什么不应该使用函数的技术原因是什么?(例如,或)? 为什么我要使用其他东西,即使它们在我的网站上工作? 如果它们在我的网站上不起作用,为什么我会收到类似的错误 警告:mysql_connect():没有那个文件或目录 问题答案: MySQL 扩展: 未在积极开发中 被正式弃用的PHP 5.5(发布2013年6月)。 自 PHP 7.0起 已完全删除 (2015 年 12 月发布) 这

    • 问题内容: 想要改善这篇文章吗? 提供此问题的详细答案,包括引文和为什么答案正确的解释。答案不够详细的答案可能会被编辑或删除。 为什么不应该使用功能的技术原因是什么?(例如,或)? 即使我的网站上可以工作,我为什么还要使用其他东西? 如果它们在我的网站上不起作用,为什么会出现类似 警告:mysql_connect():没有这样的文件或目录 问题答案: MySQL扩展: 没有积极发展 被 正式 弃用

    • 问题内容: 我一直认为,在实现Runnable的java类中同步run方法是多余的。 我试图弄清楚为什么人们这样做: 这似乎是多余且不必要的,因为它们正在为另一个线程获取对象的锁。更确切地说,他们明确指出只有一个线程可以访问run()方法。但是由于它是run方法,它本身不是自己的线程吗?因此,只有它可以访问自身,并且不需要单独的锁定机制? 我在网上找到了一个建议,即通过同步运行方法,您可以通过以下