composer中文骨架需设type为skeleton,用{vendor}/{name}占位符配合post-create-project-cmd动态替换命名空间、autoload及文件内容,并规避utf-8路径问题以确保跨平台稳定运行。

Composer 中文规范项目骨架生成器不是靠模板 ZIP 或 GitHub Template 能解决的,关键在 composer create-project 的底层行为和 composer.json 元数据控制——你得让 Composer 自己“认出”这是个 skeleton,且能正确处理中文路径、PSR-4 命名空间映射、以及 vendor 内依赖的自动适配。
为什么 create-project 会忽略你的中文命名空间?
Composer 默认把 name 字段(如 vendor/project-name)直接用于 PSR-4 自动加载配置生成,但如果你的骨架中 autoload 是空的或写死路径,它就不会根据用户输入的项目名动态替换命名空间前缀。更麻烦的是,中文字符本身在 name 里不被允许(Composer 会报错 Invalid package name),所以“中文规范”实际体现在项目初始化后的目录结构与文件内容,而非包名。
- 必须把命名空间占位符写成
{vendor}和{name},并在scripts中用post-create-project-cmd触发替换 -
composer.json的type必须设为skeleton,否则create-project不会执行post-create-project-cmd - 避免在
autoload里写死类似"App\": "src/"—— 这会让最终项目无法按用户输入调整命名空间
post-create-project-cmd 脚本该做什么?
这个钩子不是用来跑完整安装流程的,而是做三件事:清理 scaffold 文件、替换占位符、重写 composer.json 的 name 和 autoload。它运行时,当前目录已是新项目根目录,$argv[1] 是用户传入的目标目录名(可能含中文),但 Composer 不会自动帮你解析 vendor/name,得自己拆解。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 用
basename(getcwd())获取项目目录名,再按/分割取最后一段作为name,用ucwords(str_replace(['-', '_'], ' ', $name))生成 PascalCase 命名空间前缀 - 用
file_get_contents()+str_replace()批量替换src/下所有 PHP 文件里的{namespace}、{class}占位符 - 用
json_decode(file_get_contents('composer.json'), true)修改name(填入your-vendor/用户输入的小写连字符名)、autoload.psr-4(填入新命名空间 +src/) - 别忘了
unset($json['scripts']['post-create-project-cmd']),防止下次 install 时重复执行
中文路径下 composer install 报错怎么办?
不是骨架的问题,是 Windows 或某些旧版 PHP 环境对 UTF-8 路径支持不全导致的,典型错误是 file_put_contents(): Filename cannot be empty 或 failed to open stream: No such file or directory。Composer 本身不处理路径编码,它依赖 PHP 的 realpath() 和 file_exists() 行为。
- 确保 PHP 版本 ≥ 7.4,且
mbstring.func_overload未启用(会干扰路径函数) - 在
composer.json的config段加"platform-check": false和"fxp-asset": {"enabled": false}(避免旧插件触发路径问题) - Windows 用户需确认终端使用 UTF-8 编码(PowerShell 执行
chcp 65001),并关闭杀毒软件实时扫描 vendor 目录 - 不要在项目路径里用全角空格或特殊符号(如 《》、【】),即使中文名也只用汉字、数字、半角横线和下划线
真正难的不是生成骨架,而是让 create-project 在不同系统、不同 PHP 版本、不同终端编码下都稳定输出可运行代码——占位符替换必须幂等,命名空间推导不能依赖扩展,所有路径操作得绕过 realpath() 的编码陷阱。做完这些,中文用户才能 cd 进去就 php -S localhost:8000 跑起来。










