【问题标题】:What are the differences between composer update and composer install?作曲家更新和作曲家安装有什么区别?
【发布时间】:2016-01-08 05:23:22
【问题描述】:

composer updatecomposer install 有什么区别?

【问题讨论】:

    标签: php composer-php


    【解决方案1】:

    作曲家更新

    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 update 创建的 composer.lock 文件中存储的相同依赖项将我们的应用程序安装到生产服务器或测试环境中。

    【讨论】:

    • 您没有描述如果我们没有锁定文件并调用 composer install 会发生什么。顺便说一句,很好的描述。
    • 有一天可能会咬你的重要一件事 - 锁定文件不是递归的。如果某些包具有松散定义的依赖项,并且如果您碰巧在干净的机器上获取了一个干净的项目副本,它可能会安装不同版本的嵌套依赖项,其中可能包括新的错误甚至破坏性更改!特别是与持续集成和构建服务器相关。解决方案 - 寻找嵌套有问题的包并将其固定好的版本添加到 json 和锁定文件。
    • 那么,如何安全地更新生产服务器上的特定包?
    • @Michel 您应该首先在本地系统上运行composer update 并测试您的应用程序,然后将composer.lock 上传到您的生产服务器上并运行composer install
    • 这里也有很好的解释:daylerees.com/the-composer-lock-file
    【解决方案2】:

    当您运行composer install 时,它会查找锁定文件并安装其中包含的任何内容,如果找不到,它将读取composer.json,安装其依赖项并生成锁定文件。

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

    【讨论】:

      【解决方案3】:

      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

      更新命令从 当前目录,对其进行处理,然后更新、删除或安装所有 依赖关系。


      另请参阅:Composer: It’s All About the Lock File

      【讨论】:

      • composer 安装点 3 没有意义。如果 .lock 文件已经存在,它只会读取它并且永远不会“更新”它。只有当它不存在时才会创建它..
      • @Ben 我已经澄清了要点,现在让我知道它们是否有意义。
      【解决方案4】:

      作曲家安装

      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,他们可能有不同的依赖版本。

      如果我们总是在 composer.json 中使用 EXACT 版本,例如 "monolog/monolog": "1.0.1",会怎样?
      我们仍然需要composer.lock,因为composer.json只跟踪你的依赖的主版本,它不能跟踪依赖的依赖版本。

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

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

      【讨论】:

        【解决方案5】:

        composer updatecomposer 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 将连同他的所有依赖项一起被删除

        【讨论】:

          猜你喜欢
          • 2021-08-07
          • 2013-06-02
          • 2018-07-19
          • 1970-01-01
          • 2018-10-21
          • 1970-01-01
          • 2020-06-13
          • 2017-03-13
          • 2014-01-30
          相关资源
          最近更新 更多