要被composer create-project正确识别为模板,composer.json中type字段必须显式设为"project",且需配置有效autoload(如"psr-4": {"app\\": "src/"})和无语法错误;name、description非运行必需但利于可读性与packagist展示。

composer.json 里怎么写才能当模板用
能被 composer create-project 正确识别并复用的模板,核心是 type 字段必须设为 "project",且不能有未解决的依赖冲突或语法错误。其他字段如 name、description 是为了人类可读和 Packagist 展示,不是运行必需。
实操建议:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
type必须显式写成"project",哪怕只是本地模板——否则create-project可能跳过自动加载初始化或脚本执行 -
autoload要提前配好(比如"psr-4": {"App\": "src/"}),否则新项目生成后要手动补,不然vendor/autoload.php加载不到你自己的类 - 别在模板里写死具体版本号,比如
"php": "^8.1"可以,但"monolog/monolog": "2.13.0"就太僵硬;用"^2.13"或"^2.0"更利于下游项目升级 - 如果模板含占位符(如
MyVendorMyApp),记得在scripts里配post-create-project-cmd去替换,而不是靠人工改
post-create-project-cmd 脚本为什么经常不执行
这个钩子只在 composer create-project 过程中触发一次,且前提是模板项目已成功克隆、composer install 完成、autoload 生成完毕。常见失败原因不是脚本写错,而是前置条件没满足。
实操建议:
- 脚本路径必须可执行:比如写
"@php ./bin/init.php",那bin/init.php文件得存在,且开头有#!/usr/bin/env php或确保php命令能访问到它 - 不要依赖
$argv或当前工作目录假设——create-project会在目标目录下运行脚本,但环境变量有限,推荐用getcwd()明确获取项目根路径 - 钩子执行时,
vendor/已存在但可能还没完成 autoload 生成,所以别在脚本里直接 new 某个 vendor 类;清理 .git、替换命名空间、生成 .env 这类文件操作是安全的 - 调试时加日志:在脚本开头写
file_put_contents('init.log', date('c') . " ", FILE_APPEND);,比看终端输出更可靠
能不能让模板自动适配不同 PHP 版本
不能靠模板本身“自动适配”,但可以通过 config.platform.php 锁定构建时的平台版本,避免在高版本 PHP 上装了低版本不兼容的扩展依赖。
实操建议:
- 在模板的
composer.json里加:"config": {"platform": {"php": "8.1.0"}},这样即使你在 PHP 8.3 环境跑create-project,Composer 也会按 8.1 的约束选包,防止装上只支持 8.2+ 的扩展 - 别滥用
platform:它只影响依赖解析,不改变运行时行为;如果你的模板代码用了str_contains(),那 PHP - 真正需要多版本兼容时,靠
require中的版本约束更直接,比如"ext-json": "*"比写死"ext-json": "^1.0"更稳妥
为什么用 composer create-project 生成的项目 vendor/autoload.php 不生效
大概率是模板里的 autoload 配置没生效,或者新项目没重新 dump autoload。create-project 不会自动执行 composer dump-autoload,尤其当模板里没设 autoload-dev 或 PSR-4 映射路径写错时,vendor/autoload.php 就只是个空壳。
实操建议:
- 检查模板
composer.json中autoload的路径是否相对于模板根目录——比如写"src/"是对的,"./src/"或"src"(缺末尾斜杠)都会让 Composer 忽略整条规则 - 生成新项目后,立刻进目录执行
composer dump-autoload -o,确认无报错;再测试require 'vendor/autoload.php'; new AppSomeClass(); - 如果用了
psr-4,命名空间末尾的反斜杠必须双写为\,JSON 里写成"App\": "src/",单写"App": "src/"会导致解析失败,Composer 直接跳过这条










