该用 require --dev 而非 require 时,是指添加仅开发阶段需要的工具(如 phpunit/phpunit、php-cs-fixer),避免其进入生产依赖树;composer install --no-dev 会完全跳过下载、解析和 autoload 注册,确保生产环境轻量安全。

Composer 本身不支持“按需下载”单个包——它总是安装 composer.json 中声明的所有依赖(包括 require 和 require-dev),但你可以通过调整依赖声明方式和使用特定命令,实现逻辑上的“按需加载”与极简安装。
什么时候该用 require --dev 而不是 require?
开发阶段才需要的工具(如 phpunit/phpunit、friendsofphp/php-cs-fixer)必须放在 require-dev,否则它们会进入生产环境依赖树,触发不必要的下载和自动加载注册。
- 运行
composer install --no-dev时,require-dev下的包完全不下载、不解析、不写入vendor/autoload.php -
require-dev中的包不会影响composer.lock的生产部署一致性——只要 CI/CD 环境统一加--no-dev即可 - 注意:
require-dev包若被require包间接依赖(比如某个库在composer.json里把phpunit放进了require),你仍会被拖进来——这时得看上游是否合理划分依赖
如何避免“被带入”不需要的二级依赖?
很多包把可选功能(如缓存驱动、数据库适配器、HTTP 客户端)作为强制依赖,导致你只用 Redis 却被迫装了 guzzlehttp/guzzle 和 doctrine/dbal。这不是 Composer 的错,而是包作者设计问题。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 优先选提供“契约接口 + 多实现分离”的包,例如
psr/cache+symfony/cache(而非直接依赖symfony/cache) - 用
composer depends <package>查谁拉进了你不想要的包,再决定是 fork 修改composer.json,还是换更轻量的替代品(比如用spatie/curl-client替代guzzlehttp/guzzle) - 慎用
replace或conflict字段硬排除——容易引发版本解析失败,只在明确知道冲突根源且无法协商时才用
composer install 和 composer update 的实际差异在哪?
很多人误以为 update 才真正“下载”,其实两者都会下载缺失的包;区别在于锁文件处理逻辑,直接影响你能否稳定复现极简依赖。
-
composer install:严格按composer.lock安装,不重新解析依赖图——这是上线部署唯一该用的命令 -
composer update:忽略lock文件,重新解析整个依赖树,可能引入新版本及新增传递依赖——仅应在明确需要升级或调试依赖冲突时运行 - 如果
composer.lock里混入了本不该存在的包(比如某次误执行update后提交了 lock),后续install也会照单全收——务必定期用composer show --tree检查实际安装结构
真正的“按需”不在下载动作本身,而在依赖声明是否精准、锁文件是否干净、环境是否隔离。一旦 composer.json 里多写了一个 require,或者某次 update 没控制好范围,极简就失效了——这种失控往往发生在团队协作中,而不是命令行里。

















