正确的 Composer 扩展包安装方法

分享 Summer ⋅ 于 2年前 ⋅ 最后回复由 Nixus 23小时前 ⋅ 33417 阅读

问题说明

我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 这个文档 的:

file

composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害。

因为 composer update 的逻辑是按照 composer.json 指定的扩展包版本规则,把所有扩展包更新到最新版本,注意,是 所有扩展包,举个例子,你在项目一开始的时候使用了 monolog,当时的配置信息是

"monolog/monolog": "1.*",

安装的是 monolog 1.1 版本,而一个多月以后的现在,monolog 已经是 1.2 了,运行命令后直接更新到 1.2,这时项目并没有针对 1.2 进行过测试,项目一下子变得很不稳定,情况有时候会比这个更糟糕,尤其是在一个庞大的项目中,你没有对项目写完整覆盖测试的情况,什么东西坏掉了你都不知道。

那应该使用哪个命令呢?install, update 还是 require ?

file

接下来我们一一解释。

简单解释

  • composer install - 如有 composer.lock 文件,直接安装,否则从 composer.json 安装最新扩展包和依赖;
  • composer update - 从 composer.json 安装最新扩展包和依赖;
  • composer update vendor/package - 从 composer.json 或者对应包的配置,并更新到最新;
  • composer require new/package - 添加安装 new/package, 可以指定版本,如: composer require new/package ~2.5.

流程

接下来介绍几个日常生产的流程,来方便加深大家的理解。

流程一:新项目流程

  1. 创建 composer.json,并添加依赖到的扩展包;
    • 运行 composer install,安装扩展包并生成 composer.lock
    • 提交 composer.lock 到代码版本控制器中,如:git;

流程二:项目协作者安装现有项目

  • 克隆项目后,根目录下直接运行 composer installcomposer.lock 中安装 指定版本 的扩展包以及其依赖;

此流程适用于生产环境代码的部署。

流程三:为项目添加新扩展包

  • 使用 composer require vendor/package 添加扩展包;
  • 提交更新后的 composer.jsoncomposer.lock 到代码版本控制器中,如:git;

关于 composer.lock 文件

composer.lock 文件里保存着对每一个代码依赖的版本记录(见下图),提交到版本控制器中,并配合 composer install 使用,保证了团队所有协作者开发环境、线上生产环境中运行的代码版本的一致性。

file

关于扩展包的安装方法

那么,准备添加一个扩展包,install, update, require 三个命令都可以用来安装扩展包,选择哪一个才是正确的呢?

答案是:使用 composer require 命令

另外,在手动修改 composer.json 添加扩展包后,composer update new/package 进行指定扩展包更新的方式,也可以正确的安装,不过不建议使用这种方法,因为,一旦你忘记敲定后面的扩展包名,就会进入万劫不复的状态,别给自己留坑呀。

上面的概念不论对新手或者老手来说,都比较混淆,主要记住这个概念:

原有项目新添加扩展的,都使用 composer require new/package 这种方式来安装。

需要加版本的话:

composer require "foo/bar:1.0.0"

更新指定扩展到指定版本

有时候你之前使用过的扩展包,加入了新功能,你想更新单独这个扩展包到指定版本,也可以使用 require 来操作。

如下面例子,需要更新 "sami/sami": "3.0." 到 "sami/sami": "3.2."

file

命令行运行:

file

composer.json 已经被自动更新:

file

完。


欢迎关注 LaravelTips, 这是一个专注于为 Laravel 开发者服务, 致力于帮助开发者更好的掌握 Laravel 框架, 提升开发效率的微信公众号.

本文章首发在 Laravel China 社区

Practice makes perfect.

本帖已被设为精华帖!
回复数量: 8
  • smarteng
    1年前

    总结的很好。

  • 廿九 1
    11个月前

    问题复杂化了,
    不想跟着升级,为什么不把版本号写死呢?
    固定版本号 3.2.1, 再update也不会自动升级
    担心自动update请别写 * , update功能挺好的, 说的那么吓人

  • wujunze talk is cheap show me the code
    2个月前

    @overtrue Hello 使用composer install后 发现suggest 的包没有安装 删掉composer.lock重试也不行 有没有遇到这种问题呢

  • overtrue MOD https://github.com/overtrue
    2个月前

    suggest 只是猜测你可能会用到的包列出来作为建议,并不是需要安装的,作为一名 PHP 程序员我觉得至少应该读一遍 composer.json scheme 的介绍吧。

  • yudaye
    1个月前

    :100:

  • 风车
    1个月前

    @overtrue Hi~ 使用composer require "mk-j/php_xlsxwriter" 后自动执行了 updating dependencies (including require-dev) 自动更新了其他扩展包的版本,这个该如何配置呢?求救!

    file

  • overtrue MOD https://github.com/overtrue
    1个月前
    $ composer require "mk-j/php_xlsxwriter"  --no-update

    https://getcomposer.org/doc/03-cli.md#require

  • Nixus
    1个月前

    @风车
    @overtrue 谢谢超哥,刚刚就是安装依赖的时候,把项目中的其它依赖全部更新了一遍,真是日了?了!草……

暂无评论~~
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 100 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

Elasticsearch-PHP 中文文档

Lumen 中文文档

GraphQL PHP 中文文档

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档