composer install 不该自动生成依赖报告,因其职责仅限安装依赖、写 autoload 和执行钩子;post-install-cmd 过早触发、编码不兼容、跨平台命令失效等问题会导致 CI 卡顿与乱码;应通过 scripts 定义显式命令并手动设置 UTF-8 编码来安全导出中文报告。

不能自动,也不该自动。composer install 的职责是安装依赖、写 autoload、执行钩子,不是生成报告——强行在 post-install-cmd 里塞 composer show 或导出逻辑,会导致 CI 卡顿、本地反复重建、路径错乱,且中文编码问题会直接让输出乱码。
为什么 post-install-cmd 不适合跑依赖报告
它在 vendor/ 尚未完全就绪时就触发,尤其 Windows 下 vendor/bin/ 脚本可能还没生成;composer show 默认输出是 UTF-8,但终端环境(如某些 CI 的 PowerShell 或旧版 Git Bash)不设 chcp 65001 或 LANG=C.UTF-8,中文字段(如 description)会变成 ??? 或空;多步骤命令用 && 在 Windows 下失效,必须改用数组写法,而数组又不能跨平台做字符集声明。
用 scripts 定义语义化命令 + 显式设置编码
把报告生成当作一次明确操作,而不是安装副作用。在 composer.json 的 scripts 段加一条干净命令:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
"scripts": {
"report:deps-zh": [
"php -d default_charset=UTF-8 -r "file_put_contents('reports/deps-zh.txt', iconv('UTF-8', 'UTF-8//IGNORE', shell_exec('composer show --no-dev')));"",
"composer show --no-dev --format=json | jq -r '.[] | "\(.name) \(.version) \(.description // "")"' | iconv -f UTF-8 -t UTF-8//IGNORE > reports/deps-zh.json"
]
}
-
php -d default_charset=UTF-8确保 PHP 内部字符串处理默认用 UTF-8 -
iconv('UTF-8', 'UTF-8//IGNORE')过滤掉无法转码的字节,避免mb_convert_encoding报错中断 -
iconv -f UTF-8 -t UTF-8//IGNORE是 shell 层兜底,防止 jq 输出被终端截断或污染 -
--no-dev排除开发依赖,避免报告混入 phpunit、phpstan 等工具链 - 输出路径
reports/deps-zh.txt和reports/deps-zh.json必须提前建好目录,否则脚本失败
导出 HTML 或 Markdown 中文报告需额外工具
composer show 原生命令不支持 --format=html,硬拼 HTML 容易漏转义(比如 description 里的 & 或 )。推荐用 akeneo/license-checker 配合自定义模板:
- 先装工具:
composer require --dev akeneo/license-checker - 创建
templates/report-zh.twig,用 Twig 的{{ item.description|e }}自动转义 - 运行:
vendor/bin/license-checker export --template=templates/report-zh.twig --output=reports/deps-zh.html - 注意:该工具读的是
composer.lock,不是 vendor/,所以即使没composer install也能跑,更适合 CI 早期阶段
真正容易被忽略的点是:中文报告不是“加个 utf8 参数”就能成——它依赖整个链路(PHP 运行时、shell 编码、终端渲染、HTML meta 声明)全部对齐,缺一不可;而 composer show 本身不控制终端输出编码,你得自己兜底,不能指望它“自动适配”。










