composer不支持中文脚本钩子,必须使用英文事件名(如post-install-cmd)或自定义英文键(如deploy:prod),中文仅可用于注释、日志或配置文件,且需注意utf-8编码与跨平台兼容性。

Composer 中文脚本钩子不能直接用——因为 Composer 本身不识别中文作为事件名或脚本键,但你可以用中文注释 + 标准事件名组合实现“语义化自动化部署”。
composer.json 里 script 键只认英文事件名
你写 "scripts" 时,键必须是 Composer 官方定义的事件名(如 "post-install-cmd"、"post-update-cmd"),不是中文。所谓“中文脚本钩子”,其实是开发者在注释或脚本命令里夹带中文说明,或者用中文变量/路径做实际操作。
- 错误写法:
"脚本部署": "php deploy.php"→ Composer 会忽略这个键,不触发 - 正确写法:
"post-install-cmd": "php deploy.php",然后在deploy.php里用中文输出日志、读取中文命名的配置文件 - 常见误判:看到别人
composer run deploy就以为是自定义中文事件 —— 实际上是用了 Composer 2.2+ 的run命令配合"scripts"里的英文键,比如"deploy": "php scripts/deploy.php"
用 composer run + 自定义 script 键实现“类中文钩子”语义
Composer 2.2 起支持 composer run 直接执行任意 scripts 下的键,这让你可以起接近业务含义的英文键名,兼顾可读性与兼容性。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 推荐写法:
"scripts": {"deploy:prod": "php scripts/deploy.php --env=prod", "sync:assets": "npm run build && cp -r dist/ public/"} - 执行:
composer run deploy:prod或composer run sync:assets,冒号分隔便于归类 - 注意:这些键名仍是英文,但语义清晰;别用空格、括号、中文,否则 shell 解析失败或 Windows 下报错
- Windows 用户额外注意:
cp命令不存在,得换成xcopy或用 PHP 脚本跨平台处理
真正自动化部署要绕开 Composer 钩子的局限
Composer 的脚本钩子本质是开发期辅助工具,不是部署管道。依赖它做上线逻辑容易出问题:
-
post-update-cmd在composer update时才触发,但线上通常只install --no-dev,钩子不会跑 - 钩子运行环境不可控:PHP 版本、扩展、PATH、用户权限可能和部署脚本不一致
- 错误被吞掉:默认情况下钩子失败不会中断整个
composer install,除非加--no-interaction --no-ansi并检查返回值 - 更稳做法:把部署逻辑抽成独立脚本(如
bin/deploy),用 CI/CD 工具(GitHub Actions、GitLab CI)或运维工具(Ansible、Deployer)调用,Composer 只负责装包
中文路径/配置在钩子里怎么安全用?
如果你的部署脚本要读写中文路径(比如 ./发布包/)、或加载含中文的 YAML/JSON 配置,关键在 PHP 层编码处理:
- 确保脚本文件本身保存为 UTF-8 无 BOM(BOM 会导致 JSON decode 失败)
- PHP 读文件前显式指定编码:
file_get_contents($path, FILE_TEXT)不够,要用mb_convert_encoding(file_get_contents($path), 'UTF-8', 'auto') - 涉及 shell 命令(如
tar -zcf打包中文文件名),优先改用 PHP 的Phar扩展或ZipArchive,避免终端 locale 差异 - Linux 下检查当前 locale:
locale | grep UTF-8;没输出就需先export LANG=en_US.UTF-8再跑 Composer
真正在生产环境搞自动化部署,别卡在“怎么让 Composer 认中文钩子”这个伪命题上。重点是把部署动作拆干净、环境隔离好、失败能定位——中文只是输出和配置层面的事,不该成为流程瓶颈。










