<p>scripts 字段必须作为 composer.json 顶层键,键名即命令名(如 dev:serve),值为字符串或数组;PHP 脚本需手动引入 autoload.php 或用 @php 前缀;传参须用 -- 分隔;钩子仅在对应生命周期或手动调用时触发。</p>

scripts 字段怎么写才有效
直接在 composer.json 的顶层 scripts 对象里加键值对,就是注册一个可执行命令——不需要插件、不依赖额外包,但拼错名、缩进错位置、少引号都会让它“静默失效”。
-
scripts必须是composer.json的一级字段,不能塞进require或autoload里面 - 键名就是命令名(如
dev:serve),运行时用composer dev:serve,大小写和符号必须完全一致 - 值可以是字符串(单条命令)或数组(多条顺序执行),推荐数组:更清晰、避免 shell 解析差异,比如
"build": ["rm -rf build/", "mkdir build", "cp -r src/ build/"] - Windows 用户注意:CMD 不认
$PATH,别直接写echo $PATH;跨平台安全写法是php -r "echo getenv('PATH');"
PHP 脚本怎么调用且不报 Class not found
Composer 执行 scripts 时不会自动加载项目 autoloader,所以直接 new 一个类就崩——这不是 bug,是设计上的隔离。
- 必须手动
require __DIR__ . '/vendor/autoload.php';,放在 PHP 脚本第一行 - 别用
include 'vendor/autoload.php'或相对路径硬编码,__DIR__是唯一靠谱的起点 - 如果脚本在
scripts/目录下,__DIR__指向的就是scripts/,所以要用__DIR__ . '/../vendor/autoload.php' - 更省心的方式:用
@php前缀,它会自动调用 Composer 当前绑定的 PHP 版本,比如"greet": "@php scripts/greet.php"
参数怎么传进去又怎么拿到
Composer 本身不解析参数,-- 是关键分隔符;漏掉它,参数就消失在半路。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行命令必须带
--:比如composer test:unit -- --filter=testLogin,否则phpunit根本收不到--filter - shell 命令中可用
$@接收全部透传参数,但 Windows CMD 不支持;统一做法是封装成 PHP 脚本,在里面读$_SERVER['argv']或getenv('COMPOSER_ARGS') - 别依赖
$1、$2——它们在 Windows 下无效,且容易被 shell 层吃掉;php scripts/run-test.php+$argv处理才是跨平台解法 - 环境变量要显式传递:比如
"dev:start": "APP_ENV=dev php -S localhost:8000"在 Linux/macOS 有效,Windows 需改用cmd /c "set APP_ENV=dev && php -S ..."或交给 PHP 脚本用getenv()读
钩子什么时候自动跑、为什么没执行
scripts 不是写完就跑,它只在明确触发点激活:要么是生命周期钩子(如 post-install-cmd),要么是手动调用(composer xxx)。没执行,八成是搞错了触发时机。
-
pre-*和post-*钩子只在对应 Composer 命令中自动运行,比如post-install-cmd只在composer install后跑,改了composer.json后直接敲composer不会触发 - 多个钩子可共用一个事件,用数组写:
"post-update-cmd": ["MyClass::onUpdate", "php artisan config:clear"] - 任一脚本返回非零退出码,同阶段后续钩子全跳过;
pre-*失败会让主命令中止,post-*失败默认只警告 - 调试时加
-v看输出,重点盯Script ... returned with error code ...这行,它告诉你哪一步挂了、为什么挂
最常被忽略的是工作路径和 autoload 的“默认不存在”——它不 cd、不 require、不继承你的 shell 环境,所有你以为“应该有”的东西,都得你自己显式写进去。

















