composer.json 的 scripts 字段是配置生成的触发器,而非生成工具本身;它通过 post-install-cmd 等钩子调度脚本执行,需适配 tp6/tp7 差异、确保 runtime 可写且环境变量可达。

composer.json 的 scripts 字段是配置生成的触发器
ThinkPHP 项目里,scripts 不是“生成配置”的工具本身,而是让生成动作自动发生的开关。比如你写了个 tools/gen-db-config.php 脚本,它本身不会运行;只有把它塞进 composer.json 的 scripts 里,再执行 composer run-script 或等钩子触发,才会真正生成 database.php 或 .env。
常见错误现象:php tools/gen-db-config.php 单独跑能成功,但 composer install 后没生成配置——说明脚本没挂到 post-install-cmd 钩子里。
-
post-install-cmd和post-update-cmd是最常用的两个钩子,适合放初始化类脚本 - 脚本命令必须用数组形式写,例如
["@php tools/gen-db-config.php"],不能直接写字符串(Composer 2.5+ 会报错) - Windows 下调用 PHP 脚本要加
@php前缀,否则可能因系统找不到php命令而静默失败
配置生成脚本必须适配 TP6/TP7 的 database.php 结构差异
TP6 和 TP7 的数据库配置字段不完全一致:TP7 默认关闭预处理模拟(PDO::ATTR_EMULATE_PREPARES = false),且部分字段如 deploy、read_master 在 TP7 中已移除或语义变更。如果生成脚本硬编码 TP6 格式,用在 TP7 项目里会导致连接失败或警告。
实操建议:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 生成脚本开头应检测当前 ThinkPHP 版本,可通过读取
vendor/topthink/think/composer.json中的version字段判断 - 避免手写完整数组结构,改用
think\facade\Config::set()动态写入后再导出,更贴近框架实际加载逻辑 - 生成后建议自动执行
php think clear:config,防止旧缓存干扰
composer config 命令和配置生成脚本是两层事
composer config 管的是 Composer 自身行为(比如镜像源、OAuth Token、vendor 目录路径),跟 ThinkPHP 的运行时配置(database.php、.env)完全无关。有人误以为设了 composer config vendor-dir 就能控制 config/database.php 位置,其实不能——后者由框架加载器决定,路径固定为 config/ 目录下。
容易踩的坑:
- 把
composer config --global github-oauth.github.com和数据库密码混淆,前者只影响依赖下载,后者才是运行时敏感信息 - 在
scripts里调用composer config修改项目级配置,结果发现没生效——因为composer config默认操作的是全局配置文件,加--local才写入当前项目的composer.json - 生成脚本依赖环境变量(如
DB_HOST),但composer run-script默认不继承 shell 环境,需显式传参或改用$_SERVER读取
service:discover 和配置生成共用同一套机制
ThinkPHP 的 php think service:discover 本质也是个配置生成动作:它扫描所有 vendor/*/composer.json 中的 extra.think.providers,把服务提供者列表写进 runtime/service.php。这个文件就是运行时容器加载服务提供者的依据。
所以如果你自己写的配置生成脚本也往 runtime/ 写东西(比如 runtime/database.php),就得注意:
-
runtime/目录权限必须可写,否则service:discover和你的脚本都会静默失败 - 别把自定义生成的配置文件和框架自动生成的混放,比如不要覆盖
runtime/service.php,否则服务注册失效 - 开发期可临时禁用
service:discover缓存,直接在config/app.php的providers数组里手动加类名,绕过生成逻辑调试更快
scripts 是个“调度器”,而所有生成动作都依赖 runtime 目录可写、autoload 已刷新、环境变量可触达这三件事同时成立。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










