post-create-project-cmd脚本不执行的根本原因是钩子未被Composer识别:必须严格定义在模板项目根composer.json的"scripts"中,键名为全小写带连字符的"post-create-project-cmd",且仅在create-project命令完成后于新项目根目录触发,install/update不会调用。

能直接复用的 Composer Starter 模板,核心不在“模板有多漂亮”,而在“create-project 跑完后能不能立刻跑起来、不报错、不手动改一堆路径和命名空间”。
为什么 post-create-project-cmd 脚本总不执行?
很多人写了 post-create-project-cmd 却发现命令根本没跑——不是脚本写错了,是钩子没被识别。
-
composer.json中必须把钩子放在"scripts"下,且 key 名严格为"post-create-project-cmd"(大小写、连字符、拼写一个都不能错) - 该钩子只在
composer create-project命令执行完毕后触发,composer install或update不会调用它 - 脚本内容如果是 PHP 文件,得确保它有可执行权限(
chmod +x bin/init-project.php),且首行加#!/usr/bin/env php - 如果脚本里用了
__DIR__或相对路径,注意:它运行时的当前工作目录是新项目根目录,不是模板源目录
PSR-4 自动加载在新项目里失效?
create-project 拉下来的代码,autoload 配置还在,但 new AppSomething() 仍报 Class not found —— 问题出在“谁负责 dump-autoload”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 模板里的
"autoload": { "psr-4": { "App\": "src/" } }是对的,但新项目第一次运行前,vendor/autoload.php还没生成 -
post-create-project-cmd脚本里必须显式调用composer dump-autoload,否则自动加载映射表为空 - 别依赖用户手动运行
composer install来补这个动作——create-project 默认已执行 install,但不会重新 dump autoload - 如果模板用了占位符替换(如把
App\替换成实际项目命名空间),替换后必须再 dump 一次,否则映射还是旧的
如何让模板支持不同项目名/作者名自动注入?
硬编码 "name": "acme/my-app" 和 "authors" 在模板里,会导致每个新项目都要手动改 composer.json —— 这违背“一键初始化”初衷。
- 用
composer create-project --stability=stable --no-interaction后,Composer 会把命令行参数(如项目目录名)传给钩子脚本,但不传作者信息 - 更可靠的方式:在
post-create-project-cmd脚本里读取当前目录名作为项目名,再用file_get_contents('composer.json')+str_replace或json_decode/json_encode动态重写name和autoload的命名空间前缀 - 作者信息建议留空或设为占位符
"authors": [{ "name": "Your Name", "email": "you@example.com" }],并在 README.md 里加一行提示:“请首次提交前更新 author 信息” - 千万别在模板里用
git init+git add .—— 这会让用户第一次git status看到一堆未跟踪文件,体验极差;留空 .git 目录,让用户自己决定是否初始化
发布到 Packagist 后,别人 install 总卡在 “Could not find package”?
本地测试成功 ≠ 发布后可用。Packagist 不是上传即生效,它需要正确解析你的包元数据。
- 确保模板项目的
composer.json里"name"字段格式为vendor/name(全小写、含斜杠),比如"acme/laravel-starter",不能是"AcmeLaravelStarter"或"acme-laravel-starter" - Packagist 同步依赖 GitHub/GitLab webhook,推送 tag(如
v1.0.0)比 push main 分支更可靠;没打 tag,Packagist 可能只抓到dev-main,而用户默认不装 dev 版本 - 用户执行
composer create-project acme/laravel-starter myapp时,如果报错找不到包,先确认composer show acme/laravel-starter是否能查到 —— 查不到说明 Packagist 没收录,或名字拼错了 - 私有模板不要发到 Packagist,改用
repositories+type: "package"手动注册,避免泄露内部结构
最易被忽略的一点:模板项目自身的 composer.lock 必须删除后再发布。它会把开发时的依赖版本锁死,导致新项目拉下来后 composer install 实际安装的是 lock 文件里那些版本,而不是模板 composer.json 声明的范围 —— 这会让新项目从第一天就偏离预期环境。

















