composer install、update、require 区别

243 阅读3分钟

1. 前言

首先要搞清楚的一件事情是,所有的依赖都定义在composer.json中。
在指定安装扩展包的时候,并不是非要指明一个精确的版本。
那么就有可能发生这么一个情况,对于同一份composer.json,我们在不同时刻拉取到的依赖文件可能不同(因为composer会在满足条件的情况下去拉取最新的那份依赖),从而导致一些异常情况。
`composer update``composer install` 正是为了解决这个问题而出现的。

2. composer install 和 composer update 的区别

相同点

当本地不存在 `composer.lock` 文件时, composer instal 和 composer update 作用相同, 都会去读取 composer.json 中定义的依赖, 并且去拉取符合条件的最新版本的依赖, 然后把所拉取到的依赖放入 vendor 目录下, 最后把所有拉取的依赖的精确版本号写入 composer.lock 文件

不同之处

当本地存在 `composer.lock` 文件时, composer install 将会去读取 composer.lock 中存储的版本号, 并且以此标准去下载依赖; 而 composer update 则不会去读取 composer.lock 中的版本号, 他仍然会去读取 composer.json 中定义的依赖, 生成新的 composer.lock 文件

composer install 和 composer update 的选择

初始安装依赖优先使用 composer install, 因为他会去读取 composer.lock 文件, 按照精确的版本号拉取依赖。
不要轻易的使用 composer update 更新所有的依赖, 因为它会去读取 composer.json 中依赖,拉取满足条件的最新依赖包,很容易出现问题。
当更新某个依赖时,可以使用 composer update
composer update topthink/think-queue=2.*

3. composer require

composer require 用于引入新的扩展包, 并且会生成新的 composer.lock 文件

4.更改composer镜像地址

查看配置:composer config -g -l
https://developer.aliyun.com/composer

5. composer install 遇到的问题

Your requirements could not be resolved to an installable set of packages
这是因为不匹配composer.json要求的版本
使用:composer install --ignore-platform-reqs 或者 composer update --ignore-platform-reqs 解决

6.优化:生成 classmap

composer dump-autoload -o
这个命令的本质是将 PSR-4/PSR-0 的规则转化为了 classmap 的规则, 因为 classmap 中包含了所有类名与类文件路径的对应关系,所以加载器不再需要到文件系统中查找文件了。可以从 classmap 中直接找到类文件的路径。

7.还可以参考的文档

https://blog.51cto.com/u_4483409/6091861

8.出现的问题

  1. 问题1
1. Your Composer dependencies require a PHP version ">= 8.1.0". You are running 8.0.25.
composer config -l -g  
可以看见 [platform-check] php-only 执行 composer config -g platform-check false
  1. 问题2 composer install 总是报错

image.png

问题原因:composer对应php的版本和安装的php版本不一致

执行 composer -vvv about 显示run的php版本是8.0.25 image.png 但安装的php版本是

image.png 导致执行的 composer dump-autoload 时 用的是php8的语法规则(php8和php7语法是有差别的,例如 php8支持 ??= ),导致报错。 然后发现 composer.phar -vvv about 对应的php版本跟安装的php版本一致

image.png 重新执行 composer.phar install 解决。
说明:通过apk add composer 导致安装的composer.phar 和 composer 对应的php版本不一致
推荐使用官网(pkg.xyz/#how-to-ins…

php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer