作曲家安装
将在composer.lock
文件中说明的任何时候安装,但是作曲家更新
将更新所有的依赖关系,并根据是什么创建一个新的composer.lock
文件需要在composer.json
。
所以很多人说只在开发中运行composer update
。但是我的问题是做composer更新
确实替换了旧的composer。锁定
文件,如果你的应用程序要中断,它将中断,因为可能与新更新的依赖项冲突。
我遇到了一种情况,我必须执行composer更新
,这个问题与pcntl
扩展有关。唯一的解决方案是进行composer更新
PHP-pcntl模块安装
我不明白为什么人们害怕在生产中运行composer update
。
我的想法如下:
你不应该在没有参数的情况下使用作曲家更新。
composer update
读取composer上列出的每个包。json,并将其更新为与指定版本约束兼容的最新可用版本。
在一个完美的世界里,所有的图书馆都将正确地遵循Semver,它不应该有任何副作用。但是从技术上讲,这并不总是正确的,你可以下载一个与前一个版本不兼容的版本,或者只是一个有未更正错误的版本。
所以,一次更新你所有的包可能会导致一些问题,除非你有时间检查你网站上的所有东西,以确保没有出错。
但是,当然,您有时必须更新特定的包,因此使用composer update xxx/xxx
非常有用,前提是您要检查包的所有实现。
当更新的软件包经过全面测试后,您可以将代码提交到登台/生产,然后运行composer安装
,以确保在所有平台上都有相同版本的软件包和依赖项。
长话短说,以下是我使用的流程:
composer要求xxx/xxx
安装新软件包composer update xxx/xxx
更新特定软件包composer在安装软件包时在所有环境上安装
。锁定文件已更新
其他想法
我曾经偶然发现一个实现,它可以在composer.json.中给出包的确切版本。开发人员解释说,这样你就可以在没有损坏的情况下使用作曲家更新
。
我不同意这个选项,因为即使使用composer中的确切版本。json,依赖项是不固定的,编写器更新可能会导致其中的潜在错误。
我的想法是,
作曲家-更新
,我宁愿这样做:
作曲家更新
,作曲家安装
请勿在生产中运行composer update
或composer install
。在其他地方执行,并将结果上载到生产服务器,但不要上载到承载应用程序的同一目录。作为一般规则,您不应该在服务的同时修改正在服务的应用程序。创建应用程序的另一个副本,当它准备好时,用最接近即时的命令替换它(例如mv
或ln-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方法,它本身不是自己的线程吗?因此,只有它可以访问自身,并且不需要单独的锁定机制? 我在网上找到了一个建议,即通过同步运行方法,您可以通过以下