Composer require-dev和require有什么区别?

Composer require-dev和require有什么区别?
最新回答
惊蛰花压重门

2021-12-14 08:14:40

在 Composer 中,require 和 require-dev 均用于声明项目依赖,但二者在用途、作用范围及部署影响上有显著区别,具体如下:

核心区别
  • require:声明生产环境必需的依赖,无论开发、测试还是生产阶段均需安装。缺少这些依赖会导致应用无法正常运行。
  • require-dev:声明仅开发或测试阶段使用的工具,生产环境无需安装,可通过命令排除以减小部署体积。
详细对比1. 用途与作用范围
  • require

    用途:包含项目运行的核心组件,如框架(Laravel)、数据库 ORM(Eloquent)、缓存库(Redis)等。

    作用范围:所有环境(开发、测试、生产)均需安装。

    示例:"require": { "monolog/monolog": "^2.0" // 日志记录库,生产环境必需}

  • require-dev

    用途:包含开发辅助工具,如测试框架(PHPUnit)、代码检查工具(PHPStan)、调试工具(Xdebug)等。

    作用范围:仅开发或测试阶段安装,生产环境排除。

    示例:"require-dev": { "phpunit/phpunit": "^9.0" // 测试工具,生产环境无需}

2. 部署影响
  • require

    依赖包会随项目部署到生产服务器,确保应用正常运行。

    若缺少这些依赖,应用可能抛出错误或无法启动。

  • require-dev

    默认情况下,运行 composer install 会安装所有依赖(包括 require-dev)。

    生产环境部署时,需通过命令 composer install --no-dev 排除开发依赖,避免:

    体积膨胀:减少不必要的包,降低部署文件大小。

    安全风险:避免暴露开发工具(如调试工具)到生产环境。

3. 典型场景
  • require 的典型包

    框架核心:laravel/framework

    数据库交互:doctrine/dbal

    HTTP 客户端:guzzlehttp/guzzle

  • require-dev 的典型包

    测试工具:phpunit/phpunit、pestphp/pest

    代码检查:phpstan/phpstan、squizlabs/php_codesniffer

    模拟工具:mockery/mockery、fakerphp/faker

实际示例

以下是一个典型的 composer.json 片段,展示二者的使用:

{ "require": { "monolog/monolog": "^2.0", // 生产环境必需的日志库 "illuminate/database": "^10.0" // 生产环境必需的数据库组件 }, "require-dev": { "phpunit/phpunit": "^9.0", // 仅开发测试用的测试框架 "phpstan/phpstan": "^1.0" // 仅开发用的静态分析工具 }}
  • 生产环境部署:运行 composer install --no-dev 后,仅安装 monolog/monolog 和 illuminate/database,排除 phpunit/phpunit 和 phpstan/phpstan。

  • 开发环境:直接运行 composer install,安装所有依赖,方便调试和测试。

为什么需要区分?
  1. 减小部署体积:生产环境无需安装测试工具或调试库,节省服务器空间。
  2. 提升安全性:避免开发工具(如 Xdebug)暴露到生产环境,减少攻击面。
  3. 明确依赖关系:区分核心依赖与开发工具,便于团队协作和维护。
总结
  • require:生产环境必需,缺少会导致应用崩溃。
  • require-dev:开发测试专用,生产环境需排除。合理使用二者,可优化项目依赖管理,确保生产环境高效、安全运行。