composer 的 scripts 字段不支持中文指令名,因底层只接受 ascii 字符命名的 key;正确做法是用英文 key(如 dev-start),中文说明置于脚本内容或注释中。

Composer 的 scripts 字段不支持中文指令名
直接在 composer.json 的 scripts 对象里写中文键名(比如 "测试安装")会导致 Composer 解析失败,报错类似:Invalid argument supplied for foreach() 或直接忽略该 script。Composer 内部用 PHP 的 json_decode() 读取配置,但后续逻辑(如 ScriptEvents 分发、命令行匹配)只接受 ASCII 字符命名的 key —— 这是底层限制,不是配置格式问题。
中文意图只能通过脚本内容体现,不能作为指令名
想实现“执行中文描述的操作”,正确做法是:用英文 key 表达用途(语义清晰、可自动化),再把中文说明写进脚本内容或注释里。例如:
{
"scripts": {
"dev-start": "php -S localhost:8000 -t public/",
"clear-cache": "php artisan cache:clear || echo '缓存已清空'",
"backup-db": "mysqldump -u root app > backup_$(date +%Y%m%d).sql && echo '数据库备份完成'"
}
}
这些 key(dev-start、clear-cache)是机器可识别的;中文字符串(如 '缓存已清空')只出现在 echo 或日志输出中,不影响执行逻辑。
想让终端显示中文提示?靠 shell 层或包装脚本
如果目标是「运行命令时看到中文反馈」,有两条路:
- 在
scripts命令里加echo或调用带中文输出的 PHP 脚本(如php bin/notify.php "正在启动开发服务器") - 不依赖
composer run,改用 shell 别名或 Makefile 封装,例如:alias 启动服务='composer run dev-start && echo "✅ 开发服务器已启动"' - 注意:Windows CMD 对 UTF-8 支持不稳定,建议在 Git Bash 或 WSL 下使用含中文的
echo
JSON 文件本身可以存中文,但 key 必须是合法标识符
composer.json 是标准 JSON,值(value)可以是任意 UTF-8 字符串,包括中文;但 key(object property name)虽语法允许 Unicode,Composer 的解析器实际按 PHP 变量命名规则处理 —— 即只接受字母、数字、下划线,且不能以数字开头。所以:
✅ "description": "这是一个 Laravel 项目" 没问题
❌ "启动服务": "php -S ..." 会失效
真正容易被忽略的是:即使你用 json_encode($arr, JSON_UNESCAPED_UNICODE) 手动生成 JSON,只要 key 是中文,Composer 加载后也无法映射到可用的 script 命令。这不是编码问题,是设计约束。











