记php升级后 导致composer命令报错的事件

本文讲述了作者在升级Laravel到7.3.19时遇到的Composer路径问题,通过排查和修改php.ini文件的include_path设置,最终解决了Composer找不到autoload.php的问题。

因使用laravel 7, 要求php在7.2以上, 我的环境还是7.1, 所以就升级为7.3.19
升级完成后,使用composer 出现一下错误

PHP Warning:  require(Composer/autoload.php): failed to open stream: No such file or directory in /usr/bin/composer on line 9

Warning: require(Composer/autoload.php): failed to open stream: No such file or directory in /usr/bin/composer on line 9
PHP Fatal error:  require(): Failed opening required 'Composer/autoload.php' (include_path='.:') in /usr/bin/composer on line 9

Fatal error: require(): Failed opening required 'Composer/autoload.php' (include_path='.:') in /usr/bin/composer on line 9

发现是Composer/autoload.php找不到, 百度了之后并没有找到想要的答案. 只有自己研究了.
文件没找到, 首先定位文件

locate Composer/autoload.php

结果为 /usr/share/php/Composer/autoload.php

which composer

找到脚本文件 /usr/bin/composer

vi /usr/bin/composer

#!/usr/bin/php
  7 <?php
  6 
  5 if (PHP_SAPI !== 'cli') {
  4     echo 'Warning: Composer should be invoked via the CLI version of PHP, not the '.PHP_SAPI.' SAPI'.PHP_EOL;
  3 }
  2 
  1 setlocale(LC_ALL, 'C');
9   require 'Composer/autoload.php';                                                                                                                                             
  1 
  2 use Composer\Factory;
  3 use Composer\XdebugHandler;
  4 use Composer\Console\Application;
  5 
  6 error_reporting(-1);
  7 
  8 // Create output for XdebugHandler and Application
  9 $output = Factory::createOutput();
 10 
 11 $xdebug = new XdebugHandler($output);
 12 $xdebug->check();
 13 unset($xdebug);
................

将第9行文件修改为绝对路径

require '/usr/share/php/Composer/autoload.php';

重新执行composer 报错改变了, 成了/usr/share/php/Composer/autoload.php里面的脚本 require另一个文件时报错.

发现这么该下去 估计会改很多文件, 应该不是这么玩的, 想了下是因为改变php环境导致的问题, 应该是php环境的问题, 不是composer的问题, 于是将/usr/bin/composer改为原来的代码.
这个东西就是个路径的问题, 后仔细看错误, 发现错误里面提了一个 include_path='.:', 那猜测是不是因为 php.ini配置文件改变后, 导致的问题.
执行

php -i | grep php.ini

Configuration File (php.ini) Path => /usr/local/php7.3/lib
Loaded Configuration File => /usr/local/php7.3/lib/php.ini

vi /usr/local/php7.3/lib/php.ini
大概729行

5 ;;;;;;;;;;;;;;;;;;;;;;;;;
   4 ; Paths and Directories ;
   3 ;;;;;;;;;;;;;;;;;;;;;;;;;
   2 
   1 ; UNIX: "/path1:/path2"
729  ;include_path = ".:/usr/share/php"                                                                                                                                          
   1 ;
   2 ; Windows: "\path1;\path2"
   3 ;include_path = ".;c:\php\includes"
   4 ;
   5 ; PHP's default setting for include_path is ".;/path/to/php/pear"
   6 ; http://php.net/include-path

729行被注释了, 哈哈哈, 找到地方了
打开729注释(去掉开头的;)
改为

 include_path = ".:/usr/share/php"

保存退出后, 运行 composer 则成功了

 ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer 1.6.5 2022-04-04 11:44:59
<think>嗯,用户想了解composer.json和composer.lock的作用、区别及使用方法。这个问题在PHP开发中很关键,因为ComposerPHP的依赖管理工具,这两个文件直接影响依赖管理的行为。 用户可能正在学习Composer的使用,或者在实际项目中遇到了依赖版本的问题。从用户引用的资料来看,用户已经看过一些说明,但需要更系统的解释。用户特别关注两者的区别,说明可能在实际协作或部署中遇到了问题。 关于这两个文件,需要从四个层面解释清楚:首先是各自的定义和作用,composer.json是开发者主动定义的依赖清单,而composer.lock是Composer自动生成的精确版本快照。这点区别非常重要,因为很多开发者会混淆两者的定位。 其次是版本管理机制的不同。composer.json允许灵活的版本约束,比如^1.2这样的范围定义,而composer.lock则录具体安装的版本号如1.2.3。这种差异直接导致了第三个层面——使用场景的区别:install命令优先使用lock文件保证一致性,update命令则根据json更新依赖。 用户引用的资料中提到"谨慎使用composer update",这点需要强调。因为update会升级依赖版本,可能引入不兼容变更。应该补充说明最佳实践:日常开发中用install安装依赖,只有需要升级特定包时才使用update package_name。 最后使用方法的差异也很关键。需要明确在团队协作和部署时,必须将composer.lock纳入版本控制,否则其他成员或生产环境可能安装不一致的依赖版本。这点在用户引用[2]中提到过,但可以更突出说明。 用户引用[3]提到的安装失败问题,正好可以用来举例说明常见错误场景。当lock文件与json冲突时,Composer会回滚修改,这时候需要检查版本约束是否合理。 另外,用户没有问到但可能感兴趣的是:如何查看已安装的依赖版本?可以在相关问题里加入这个点。毕竟show命令在调试时很有用。 整体回答结构已经清晰:先分述两个文件,再对比区别,最后说明操作命令和最佳实践。特别注意要用表格突出核心差异,因为用户显然需要明确的区分点。引用标识要自然插入在关键结论处,比如"谨慎执行update"这个建议就来自用户提供的资料。 </think>以下详细解释 `composer.json` 和 `composer.lock` 的作用、区别及使用方法(基于 PHP 依赖管理工具 Composer): --- ### **一、作用** | 文件 | 核心作用 | |-----------------|--------------------------------------------------------------------------| | **composer.json** | **声明依赖需求**:开发者手动定义项目所需的包及其版本约束(如 `^8.0`)。 | | **composer.lock** | **锁定依赖状态**:Composer 自动生成,精确录**每个依赖包及其子依赖的具体版本号**。 | --- ### **二、关键区别** | 维度 | composer.json | composer.lock | |--------------------|-------------------------------------------|-------------------------------------------| | **创建方式** | 开发者手动编辑 | Composer 自动生成(执行 `install/update` 后) | | **内容** | 声明所需包及**版本范围**(如 `^7.4`) | 锁定**精确版本号**(如 `7.4.15`) | | **版本控制建议** | 需提交到版本库 | **必须提交到版本库**(确保团队环境一致) | | **优先级** | 依赖安装的初始依据 | 存在时优先使用该文件安装依赖 | --- ### **三、命令行为对比** | 命令 | 行为 | |-----------------------|----------------------------------------------------------------------| | `composer install` | 1. 若存在 `composer.lock` → **按锁文件安装**<br>2. 若无锁文件 → 读取 `composer.json` 安装并**生成锁文件** | | `composer update` | 1. 读取 `composer.json` 中的版本约束<br>2. **更新依赖到最新兼容版本**<br>3. **覆盖 `composer.lock`** | | `composer update 包名`| 仅更新指定包及其依赖,并更新锁文件 | > ️ 警告:`composer update` 会升级未固定版本的包(如 `^1.0`),可能导致依赖冲突或破坏兼容性[^1]。 --- ### **四、使用场景与最佳实践** 1. **初始化项目** ```bash composer require vendor/package # 自动添加包到 composer.json 并生成锁文件 ``` 2. **团队协作/部署生产环境** ```bash composer install # 严格按锁文件版本安装,确保环境一致[^2] ``` 3. **更新依赖** - **安全更新**:`composer update vendor/package`(仅更新指定包) - **升级所有**:谨慎使用 `composer update`(需测试兼容性) 4. **常见问题处理** - **安装失败回滚**:出现 `Installation failed, reverting...` 错误时,检查版本约束或网络问题[^3]。 - **锁文件冲突**:合并代码时若锁文件冲突,需重新运行 `composer install` 或协调更新。 --- ### **五、核心总结** | **文件** | **开发者角色** | **Composer 角色** | **团队协作意义** | |------------------|---------------|------------------------|------------------------| | `composer.json` | **手动定义** | 依赖解析的输入 | 共享包需求 | | `composer.lock` | **禁止修改** | 版本锁定的输出 | **保证环境绝对一致** | > ✅ 最佳实践:**始终将 `composer.lock` 提交到版本库**,仅在需要升级依赖时执行 `composer update`,并同步更新锁文件。 --- ### 相关问题 1. 如何解决 `composer install` 时出现的依赖冲突? 2. 为什么 `composer update` 可能破坏项目稳定性?如何安全升级依赖? 3. `composer.lock` 文件冲突时,正确的解决流程是什么? 4. 如何查看项目中已安装的依赖及其版本(如使用 `composer show`)? 5. 如何为 Composer 配置镜像源以加速安装(如 `composer config repo.packagist`)? [^1]: 引用自站内说明:`composer update` 会覆盖锁文件且更新未固定版本的包。 [^2]: 引用自站内说明:多人协作时提交 `composer.lock` 可确保环境一致。 [^3]: 引用自站内报错示例:依赖安装失败时 Composer 自动回滚文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值