【问题标题】:Why does composer removes my dependencies on deploy?为什么作曲家会删除我对部署的依赖?
【发布时间】:2015-09-18 12:08:58
【问题描述】:

我遇到了 composer 的问题。 我正在本地环境中使用 git。我是唯一的开发者。

当我需要更多依赖项(或需要更改某些版本)时,我编辑 composer.json 并在本地运行 composer install

一切都很好。

然后,当一切都在本地运行时,我提交我的更改(包括 composer.jsoncomposer.lock)并推送到我的生产服务器。

post-receive 脚本更新源并在远程服务器上运行composer install

预期结果:

  • Composer 应根据 composer.lock 文件安装新的依赖项。
  • 我应该很高兴。

会发生什么:

  • 作曲家很生气:

警告:锁定文件不是最新的 作曲家.json。您可能会得到过时的依赖项。运行更新到 更新它们。

  • Composer 删除所有依赖项
  • 我的生产中断了
  • 我心脏病发作了
  • 我必须通过 ssh 登录到我的服务器并运行 composer update 才能正常工作,但我知道不建议在生产服务器上使用 composer update

这是 post-receive 作曲家部分的输出:

composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
  - Removing guzzle/guzzle (v3.9.3)
  - Removing symfony/event-dispatcher (v2.7.1)
  - Removing geoip/geoip (v1.15)
  - Removing pimple/pimple (v3.0.0)
  - Removing cocur/slugify (1.1.x-dev)
  - Removing bentools/url (0.2)
  - Removing bentools/simplexmlextended (1.2.0)
Generating autoload files

我做错了什么?

谢谢, 本

【问题讨论】:

    标签: php git deployment composer-php


    【解决方案1】:

    这个警告

    警告:锁文件不是最新的 composer.json 中的最新更改,您可能会得到过时的依赖项,运行更新来更新它们。

    当您的composer.jsonmd5sumcomposer.lock 中存储的不同时发生:

    {
        "hash": "b15ed9405e8547867f74973ce8add172",
        "packages": [ ... ]
    }
    

    确保您的 composer.jsoncomposer.lock 与您本地的相同(比较它们的 md5sums)。我怀疑您的部署链中的某些内容没有正确更新它们。

    确保使用require 命令在本地添加了依赖项:

    composer require new/package ~2.5
    

    或者如果composer.json被手动编辑,至少运行

    composer update new/package
    

    之后为每个额外添加的包确保它正确添加到您的composer.lock

    另一种方法:
    在生产中运行composer update --lock。这将更新您的锁定文件中的哈希值,但不会升级您的供应商。

    然后运行composer install 以从您的comoser.lock 安装供应商。

    【讨论】:

      【解决方案2】:

      当我需要更多依赖项(或需要更改某些版本)时,我会编辑 composer.json 并在本地运行 composer install。

      这是错误的。您可以编辑composer.json,然后必须运行composer update,或者让Composer 对json 文件进行内部编辑,然后运行composer require new/package(可选版本)。

      无论哪种方式,您最终都应该得到一个已更改的 composer.jsoncomposer.lock 文件,将两者都提交到您的存储库中,预期的结果是锁定文件将包含正确版本的所有包,应该安装在生产中使用常规的 composer install 运行。

      请注意,您的工作流程仍然非常危险。如果你推送,但 Github 已关闭 - 你将如何安装 ZIP?

      【讨论】:

      • 好的,那我就这样吧。对于 github 宕机的情况,你有什么建议?
      • Git 和 Composer 都不是部署工具。它们被大量使用,但这并不意味着它是最好的解决方案。一般而言,您会将包含生产更新所需的所有代码(包括 Git 中的代码以及 Composer 中的所有内容)放在一起的 ZIP 或 TGZ,将其移动到生产机器,解压缩,(在隐藏的place - 可选),然后立即切换到它。有这方面的工具 - Capistrano 就是其中之一。为了避免 Github 停机和更快的访问,请使用 Satis 创建您使用的依赖项的本地副本。细节需要提出一个新问题。
      猜你喜欢
      • 2019-04-22
      • 1970-01-01
      • 2013-04-15
      • 2015-01-11
      • 2016-09-12
      • 2021-06-11
      • 2015-03-26
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多