不可行,因composer install仅管理依赖与执行脚本钩子,强行绑定post-install-cmd会导致CI/CD变慢、环境兼容性差及命令路径失效;应通过scripts定义语义化命令(如"docs")手动触发。

composer install 后自动跑文档生成,基本不可行
因为 composer install 的核心职责是安装依赖、写 autoload、执行脚本钩子(如 post-install-cmd),但它不负责也不适合承担文档生成任务。强行绑定会导致三个实际问题:
- 每次
composer install都触发一次完整文档重建,CI/CD 流水线变慢,本地开发也卡顿 - 文档工具(如
phpdoc或doxygen)依赖 PHP 扩展(如xml、mbstring)、内存足够(常需-d memory_limit=-1),而部署环境往往不具备这些条件 -
post-install-cmd在vendor/尚未完全就绪时就执行,容易报command not found: phpdoc或路径解析失败
用 scripts 定义语义化命令才是正解
把文档生成当作一个明确的开发操作,而不是安装副作用。在 composer.json 的 scripts 段里加一条干净的命令:
"scripts": {
"docs": [
"rm -rf docs/api",
"php -d memory_limit=-1 vendor/bin/phpdoc --config=phpdoc.xml"
],
"docs:doxygen": "doxygen Doxyfile"
}
这样你只需手动运行:
composer docs —— 调用 phpDocumentor
立即学习“PHP免费学习笔记(深入)”;
composer docs:doxygen —— 调用 Doxygen
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
关键点:
- 命令名用
docs而不是generate-docs或build-docs,更短、更易记、社区通用 - 多步骤必须用数组写法,否则 shell 连接符(
&&)在 Windows 下会失效 -
php -d memory_limit=-1显式声明内存限制,避免大项目中途 OOM - Doxygen 不走 Composer 管理,得确保系统级已安装且
doxygen在$PATH中
phpdoc.xml 里三处不填对,生成就白跑
phpdocumentor v3 强依赖 phpdoc.xml 配置,但模板里常有坑:
-
<fileset>必须包裹<directory>,单独写<directory>会被忽略 -
<directory>的path是相对于phpdoc.xml所在位置,不是项目根目录;比如phpdoc.xml在根目录,那path="src"才对 -
<exclude>必须显式列出Tests、Fixtures、vendor,否则扫描失败或文档混入测试类
示例最小可用片段:
<phpdocumentor>
<paths>
<output>docs/api</output>
</paths>
<version number="<?php echo json_decode(file_get_contents('composer.json'))->version; ?>">
<fileset>
<directory path="src"></directory>
<exclude>Tests</exclude>
<exclude>Fixtures</exclude>
</fileset>
</phpdocumentor>
Doxygen 和 phpDocumentor 别混着用
两者定位不同,强行共存反而增加维护成本:
-
phpDocumentor:专注 PHP DocBlock,输出结构化 API 文档,支持版本切换、搜索、响应式 UI,适合对外交付 -
Doxygen:跨语言、重注释格式(支持///、/**、//!),可导出 LaTeX/PDF,适合内部技术手册或混合语言项目 - 同一项目同时配两套,
composer.json脚本膨胀、CI 构建时间翻倍、新人搞不清该跑哪个 - 如果真要双轨,建议用不同命令前缀区隔:
docs:api(phpdoc)和docs:tech(doxygen)
真正容易被忽略的是缓存行为:phpDocumentor v3 默认启用缓存,但缓存路径没显式配置时会落在临时目录,导致二次生成仍扫描全部文件。务必在 phpdoc.xml 中加 <cache><directory>docs/cache</directory></cache>。

















