post-create-project-cmd仅在create-project生成新项目时触发,且必须定义在模板项目的composer.json中;它不适用于require场景,也无法在被依赖包中声明生效。

不能靠 post-create-project-cmd 给“自己发布的包”加安装提示——它只对被 create-project 创建出的新项目生效,且提示必须写在那个新项目的 composer.json 里。
post-create-project-cmd 的执行主体不是你的包,而是新项目
很多人想在自己写的组件包(比如 vendor/my-component)里加个钩子,让别人 composer require vendor/my-component 时弹个提示。这行不通。post-create-project-cmd 根本不参与 require 流程,只在 composer create-project vendor/name 完成后、于**新生成的项目根目录**中执行,且前提是那个新项目的 composer.json 自己声明了该钩子。
也就是说:你作为包作者,只能把提示逻辑放进「模板项目」的 composer.json,而不是放进 my-component 这个库的配置里。
- ✅ 正确场景:你维护一个 Laravel starter 模板(
myorg/laravel-starter),它的composer.json里写了"post-create-project-cmd",用户运行composer create-project myorg/laravel-starter myapp后,提示就出来了 - ❌ 错误尝试:你在
my-component的composer.json里写"post-create-project-cmd",然后让用户require它——这个钩子永远不会被识别或执行 - ⚠️ 注意:
create-project会把模板项目的整个composer.json复制到新项目中,所以钩子是“随骨架一起落地”的,不是远程调用
想给 require 行为加提示?用 post-install-cmd + 条件判断
如果你的真实需求是:“只要有人装了我的包,就想让他看到一行提示”,那得换思路:post-install-cmd 或 post-update-cmd 更合适,但要防止重复刷屏。
关键在于判断当前是否首次安装你的包,而不是整个项目。Composer 没有原生事件支持“某包安装完成”,但你可以借 composer show --format=json vendor/my-component 或检查 vendor/vendor/my-component 目录是否存在来间接判断。更轻量的做法是写个简单 PHP 脚本:
php -r "if (file_exists('vendor/vendor/my-component')) { echo "\n? my-component installed successfully!\n"; }"
把它塞进主项目的 post-install-cmd 数组里即可。不过要注意:
- 这个提示会在每次
composer install都出现,除非你加文件标记(如写个.my-component-installed)并先检查 - 不要用
echo直接输出——某些 CI 环境会静默掉 stdout,建议加fprintf(STDERR, ...)提高可见性 - 如果提示含交互内容(如“按回车继续”),
create-project默认关闭 stdin,必须加--interactive参数才有效
拼写和格式错误会导致钩子彻底静默
post-create-project-cmd 是 Composer 中最易写错的钩子名之一。它不是 post-create-project,也不是 post-create-project-command,更不是 PostCreateProjectCmd。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
常见失效原因包括:
- 名字多一个
r:写成post-create-project-cmd✅ vspost-create-project-cmd❌(后者根本不存在) - 用了空格或下划线代替连字符:
"post install cmd"或"post_create_project_cmd" - 值不是数组:
"post-create-project-cmd": "php -r "echo 'hi';""❌(必须是字符串数组) - 放在了子依赖的
composer.json里,而不是目标模板项目的根配置中
一旦写错,Composer 不报错、不警告、不提示——它就当没这回事,直接跳过。
真正可控的提示方式:用自定义脚本 + run-script
如果既要提示,又要确保只在特定时机触发、还能传参或做环境判断,推荐放弃钩子,改用显式调用:
在你的模板项目 composer.json 的 scripts 里加一条:
"scripts": {
"welcome": [
"php -r "echo '\n? Welcome to my template!\n';""
]
}
然后告诉用户安装完运行:
composer run-script welcome
这种方式优势明显:
- 完全可控:不会被
--no-scripts或环境变量意外屏蔽 - 可带参数:
composer run-script welcome -- --env=prod(需脚本自行解析) - 调试方便:单独执行就能验证,不用反复跑
create-project - 兼容性好:不依赖钩子机制,Composer 1.x / 2.x 均可用
复杂点在于:它需要用户多打一行命令;容易被忽略的地方是——没人告诉你该运行什么,所以得在 README 或 create-project 输出末尾加一行提示,比如用 post-create-project-cmd 输出那句 “Run composer run-script welcome to get started”。










