post-create-project-cmd 是 composer 在 create-project 成功后仅执行一次的钩子,用于新项目初始化(如生成 .env、删测试文件),须置于根 composer.json 的 scripts 中,名称严格为小写全称,不可用于 install/update 或 ci/cd 场景。

post-create-project-cmd 是什么,它在什么时候执行
这个钩子只在 composer create-project 命令成功创建项目后立即运行一次,不是每次 install 或 update 都触发。它不适用于日常开发流程,只管“新项目落地后的第一件事”——比如删掉 vendor 里的测试文件、生成密钥、初始化 Git 仓库。
常见错误现象:composer install 后发现脚本没跑,或者 create-project 时提示 Script not found,基本都是因为写错了钩子名(比如拼成 post-create-project 少了 -cmd)或放错了位置。
- 必须写在根
composer.json的"scripts"字段下,不能放在require-dev依赖包里 - 钩子名严格区分大小写,只能是
"post-create-project-cmd" - 脚本内容可以是 PHP 回调、shell 命令或第三方命令(如
"php -r \"file_put_contents('.env', 'APP_ENV=local');\"")
怎么写一个安全可用的 post-create-project-cmd 脚本
直接写 shell 命令最简单,但跨平台兼容性差;用 PHP 回调更可控,能做路径判断、文件存在性检查。别忘了当前工作目录是新项目的根目录,不是 Composer 自身安装路径。
典型场景:生成 .env 文件、设置权限、清理样板代码。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 推荐用匿名函数方式,避免依赖外部类未加载:
"post-create-project-cmd": ["php -r \"copy('.env.example', '.env');\"", "php -r \"file_put_contents('.env', str_replace('APP_DEBUG=true', 'APP_DEBUG=false', file_get_contents('.env')), FILE_APPEND);\""] - 如果调用自定义 PHP 类,确保该类已通过
autoload注册,且在create-project时能被自动加载(通常需提前声明"psr-4"或"files") - 不要在脚本里执行
composer install—— 此时vendor刚解压完,autoload还没生成,会报Class not found
为什么有时候脚本根本不执行
最常见的原因是 Composer 版本差异和项目模板结构问题。Composer 2.2+ 对钩子执行更严格,而老模板若用了 composer.json 中的 "type": "project" 却没配钩子,就完全静默。
- 确认你用的是
composer create-project vendor/name,不是git clone + composer install—— 后者根本不会触发该钩子 - 检查是否启用了
--no-scripts或COMPOSER_NO_INTERACTION=1等环境变量,它们会跳过所有脚本 - Composer 会把错误输出到 stderr,但默认不显示完整堆栈;加
-v参数重试才能看到真实报错,比如PHP Fatal error: Uncaught Error: Call to undefined function file_put_contents() - Windows 下双引号嵌套容易出问题,建议统一用单引号包裹整个命令,内部用双引号(如
'php -r "copy(\'.env.example\', \'.env\');"')
替代方案:什么时候不该用 post-create-project-cmd
如果你需要在 CI/CD 流水线里初始化项目、或想让每个团队成员都走同一套初始化逻辑,这个钩子反而不可靠——它只在本地运行,无法保证远程构建环境也执行。
- Git 模板或 GitHub Template 功能更稳定,适合分发带预置配置的新项目
- 用 Makefile 或
bin/init脚本显式调用,比依赖 Composer 钩子更易调试和复现 - 某些操作(如生成密钥)其实更适合放到应用启动时检测并自动创建,而不是卡死在项目创建环节
真正难处理的是路径和权限的组合问题:比如 chmod -R 755 storage 在 macOS 上有效,在 Linux 容器里可能因挂载选项失效,而 Windows 直接忽略。这类细节,光靠一个钩子兜不住。










