require-dev声明测试依赖、scripts定义测试命令、composer test触发是开源php包自动化测试最轻量可靠的做法;必须严格隔离开发与生产依赖,ci中禁用composer update以防依赖树意外变更。

直接上结论:用 require-dev 声明测试依赖 + scripts 定义测试命令 + composer test 触发,是开源扩展包自动化测试最轻量、最可靠的做法。
怎么配 require-dev 和 scripts
测试依赖不能混进生产依赖里,否则用户安装你的包时会拉下 PHPUnit、PHPStan 等一堆开发工具。必须严格隔离:
-
require-dev只放测试相关包,比如"phpunit/phpunit": "^10.5"、"phpstan/phpstan": "^1.12" -
scripts里定义清晰的命令别名,例如:"test": "phpunit --configuration phpunit.xml.dist",避免用户记不住完整命令 - 如果想覆盖默认行为(比如跳过某些测试目录),在
phpunit.xml.dist里配<testsuites></testsuites>,而不是把参数塞进scripts字符串里
为什么不能用 composer update 跑测试
CI 环境里执行 composer update 是危险操作——它会无视 composer.lock,重新解析整个依赖树,可能意外升级 PHPUnit 或断言库,导致测试通过/失败结果不可控。正确做法是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 本地开发时用
composer update更新依赖并提交新的composer.lock - CI 流水线只跑
composer install --no-dev(装生产依赖)和composer install --dev(再装测试依赖) - 确保
composer.lock提交进 Git,否则别人 clone 下来跑composer install会得到和你本地不一致的测试环境
post-autoload-dump 钩子适合做什么
这个钩子在每次生成自动加载文件后触发,适合做静态检查或预编译类映射,但不适合跑单元测试。原因很实际:
- 它会在
composer install、composer dump-autoload、甚至composer update时都执行,容易误触发 - 如果测试失败,会中断依赖安装流程,让使用者误以为包本身有问题
- 真正需要的是「明确执行」——比如
composer test或 CI 中显式调用phpunit
复杂点在于:测试环境要和真实使用环境对齐。比如你的包声明了 "topthink/framework": "^8.0" 作为 require,那测试就得在 ThinkPHP 8.x 下跑;如果只是工具类包,就该用 "php": "^8.1 || ^8.2" 做最低兼容约束,而不是盲目锁死框架版本。










