composer更新和composer安装之间有什么区别?


Answers:


296

作曲家更新

composer update 将更新您在中指定的依赖关系 composer.json

例如,如果您需要将此软件包作为依赖项:

"mockery/mockery": "0.9.*",

并且您实际上已经安装了0.9.1该软件包的版本,运行composer update将导致该软件包的升级(例如0.9.2,如果已经发布,则升级为)。

详细composer update将:

  • composer.json
  • 删除不再需要的已安装软件包 composer.json
  • 检查所需软件包最新版本的可用性
  • 安装最新版本的软件包
  • 更新composer.lock以存储已安装的软件包版本

作曲家安装

composer install不会更新任何东西;它只会安装composer.lock文件中指定的所有依赖项

详细地:

  • 检查composer.lock文件是否存在(如果不存在,请运行composer-update并创建文件)
  • 读取composer.lock档案
  • 安装composer.lock文件中指定的软件包

何时安装以及何时更新

  • composer update通常用于“开发阶段”,以根据composer.json文件中指定的内容升级项目包,

  • composer install 主要用于“部署阶段”,使用存储在composer更新创建的composer.lock文件中的相同依赖项,将我们的应用程序安装在生产服务器或测试环境上。


5
您没有描述如果我们没有锁定文件并致​​电composer install将会发生什么。不错的描述顺便说一句。
user1954544

1
重要的事情可能有一天会困扰您-锁定文件不是递归的。如果某个程序包具有松散定义的依赖关系,并且您碰巧在干净的计算机上获取项目的干净副本,则它可能会安装不同版本的嵌套依赖关系,其中可能包括新的错误,甚至可能破坏更改!与持续集成和构建服务器特别相关。解决方案-寻找嵌套的有问题的程序包,然后将其固定好的版本添加到json和锁定文件中。
JustAMartin

composer global update更新本地系统上全局存储库中的依赖项(COMPOSER_HOMEenv变量)
Yousha Aleayoub

1
然后,如何安全地在生产服务器上更新特定的软件包?
米歇尔

@Michel您应该首先composer update在本地系统上运行并测试您的应用程序,然后将composer.lock上传到生产服务器上并运行composer install
Amin Shojaei

58

运行时composer install,它将查找一个锁定文件并安装其中包含的所有内容,如果找不到该文件,它将读取composer.json,安装其依赖项并生成一个锁定文件。

运行时,composer update它只会读取composer.json,安装依赖项并更新锁定文件(或创建新的锁定文件)。


23

composer install

  1. 如果composer.lock确实存在。
    • 处理并安装composer.lock文件中的依赖项。
  2. 如果composer.lock确实存在。
    • 流程软件包从安装composer.json
    • composer.lock根据已安装的软件包创建文件。

根据composer help install

install命令composer.lock从当前目录读取文件,进行处理,然后下载并安装该文件中概述的所有库和依赖项。如果文件不存在,它将查找composer.json并执行相同的操作。


composer update

  1. 处理composer.json文件中的依赖项(安装,更新和删除)。
  2. composer.lock根据更改创建或更新文件。

根据composer help update

update命令composer.json从当前目录读取文件,进行处理,然后更新,删除或安装所有依赖项。


另请参阅:作曲家:全部关于锁定文件


作曲家的安装点3没有意义。如果.lock文件已经存在,它将只读取它,而不会“更新”它。如果它还不存在..只创建

@Ben我已经阐明了要点,现在让我知道它们是否有意义。
kenorb

3

composer update和之间的最大区别composer install

作曲家安装

要添加依赖项,您需要将其手动添加到composer.json文件。

如果存在composer.lock文件,请完全安装此文件上指定的内容

  • 否则,请阅读composer.json文件以了解需要安装哪些依赖项
  • 使用项目信息(已安装的依赖项)编写composer.lock。

此命令不会更新任何组件。

作曲家更新

要添加或删除依赖项,您需要将其手动添加到composer.json文件中

  • composer.lock文件将被忽略
  • composer.json文件依赖项将被安装和更新(如果未安装依赖项,则将被下载)

如果您不能(或者不知道如何添加或删除实际上很简单的库,只需在文件的require属性中添加依赖项的名称和版本)即可手动修改composer.json文件更喜欢使用命令行,composer为此具有特殊功能:

作曲家要求

例如,如果我们要在命令行中添加依赖项,则只需执行

composer require twig/twig

  • composer.json文件将被自动修改并添加新的依赖项
  • 依赖项将下载到项目中

作曲家删除

如果要删除未使用的依赖项,我们将简单地执行:

composer remove twig/twig --update-with-dependencies

  • 特威格(Twig)的所有依赖都将被删除

1

作曲家安装

if(composer.lock existed){
   installs dependency with EXACT version in composer.lock file
} else {
   installs dependency with LATEST version in composer.json
   generate the composer.lock file
}

作曲家更新

composer update = remove composer.lock -> composer install

为什么我们需要2个命令。我认为它可以通过composer.lock进行解释。

想象一下,我们没有composer.lock并且composer.json里面有一个依赖项"monolog/monolog": "1.0.*""monolog/monolog": "^1.0"
那会有一些情况

  • 我们今天可以使用当前的依赖版本(例如:1.0.0)很好地工作,但是几个月后,依赖更新(例如:1.0.1)并可能会出现一些错误
  • 如果另一个团队成员composer install在不同的时间运行,他们可能具有不同的依赖版本。

如果我们总是使用EXACT版本,composer.json例如"monolog/monolog": "1.0.1"
我们仍然需要,composer.lock因为composer.json仅跟踪依赖关系的主版本,而不能跟踪依赖关系的版本。

如果所有依赖项依赖项也都使用EXACT版本,该怎么办?
想象一下,您从使用完全版本的所有依赖项开始,然后您不在乎composer.lock。但是,几个月后,您添加了一个新的依赖项(或更新了旧的依赖项),并且此依赖项的依赖项不使用EXACT版本。那么最好composer.lock一开始就关心。

除此之外,语义版本优于确切版本。在开发过程中,我们可能会多次更新依赖关系,并且库通常会有一些小的更改,例如错误修复。这样就更容易升级使用语义版本的依赖项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.