composer不支持按环境或测试类型隔离dev依赖,本质是策略问题而非功能缺陷;所有--dev包均写入require-dev字段,须通过独立composer.json+--working-dir实现物理隔离。

Composer 本身不支持按环境或测试类型“分离”引入 dev-dependencies 中的工具链,所谓“分离引入”本质是依赖管理策略问题,不是 Composer 功能缺陷。
为什么 composer require --dev 无法真正隔离检测与 Mock 工具
所有 --dev 依赖都会被写入 composer.json 的 require-dev 字段,并在 composer install 时一并安装(除非加 --no-dev)。这意味着:
-
phpstan/phpstan和mockery/mockery在本地开发、CI 测试、甚至某些调试场景中会同时存在,彼此无感知但共享同一 autoloader - 没有内置机制让
phpunit运行时“看不见”phpstan的类,反之亦然;它们只是共存,不是隔离 - 试图用
autoload-dev分组或脚本钩子“动态加载”只会增加复杂度,且无法解决类名冲突或自动加载污染
可行的分层控制:用不同 composer.json 文件 + 独立 vendor
真正的分离需要物理隔离——即不同工具链走不同依赖树。推荐做法是为静态分析和单元测试分别维护独立的 Composer 配置:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 主项目保留
composer.json,只放运行时依赖(require),require-dev清空 - 新增
phpstan/composer.json,仅含phpstan/phpstan及其插件,通过composer install --working-dir=phpstan安装到phpstan/vendor - 新增
test/composer.json,仅含phpunit/phpunit、mockery/mockery、phpspec/prophecy等,安装到test/vendor - 对应脚本如
php phpstan/vendor/bin/phpstan或php test/vendor/bin/phpunit显式调用,避免 autoload 冲突
composer create-project 不适合做工具链隔离
有人尝试用 composer create-project 拉取一个“带检测工具”的模板项目,再手动合并进主项目——这反而扩大盲区:
- 模板项目的
autoload-dev规则可能覆盖主项目配置,导致测试类被意外加载进分析流程 - 版本锁文件(
composer.lock)无法跨项目复用,CI 中容易因缓存或路径差异导致工具版本不一致 -
create-project本质是复制+install,不是引用,后续工具升级需重复操作,无法集中管理
Mock 工具实际生效的关键不在 Composer,而在测试生命周期
Mock 行为是否起作用,取决于 PHPUnit 的执行时机与 Autoloader 加载顺序,而非是否“被 Composer 引入”:
- 若
Mockery::mock()报Class 'Mockery' not found,说明test/vendor/autoload.php没被phpunit.xml的bootstrap正确引入,不是 Composer 没装好 - 若
phpstan报Call to function Mockery::mock() will always result in an error,是因为它扫描了测试文件但没加载 Mockery 的 stubs——应通过phpstan.neon的includes加入phpstan-extension,而非把 Mockery 装进主项目 - 使用
phpunit --bootstrap test/vendor/autoload.php比依赖全局vendor/autoload.php更可控
工具链物理隔离后,最大的遗漏点往往是 CI 脚本里仍用 composer install 默认行为,没指定 --working-dir 或没清理旧 vendor;一旦主项目 composer.json 里残留了 dev 依赖,就前功尽弃。










