直接用"php scripts/deploy.php"调用,脚本首行需require DIR . '/../vendor/autoload.php';@php仅限scripts字段内使用且不透参,shell中执行会报错。

直接用 php 命令调用脚本文件,别用 @php(除非你明确需要 Composer 自带的 PHP 解释器),且脚本第一行必须显式 require autoloader。
怎么写命令才真正能跑起来
在 composer.json 的 scripts 字段里,用字符串形式写 "php scripts/deploy.php" 这类调用最稳。不要写 "@php scripts/deploy.php" —— 它只在 scripts 字段内有效,且不透传参数;更别在 shell 里直接敲 @php,那会报 command not found。
-
php是系统命令,路径、版本、扩展都由当前环境决定,可控性强 -
@php是 Composer 内部语法糖,仅用于字段值解析,无法调试、不能传参、Windows 下行为偶有差异 - 如果脚本在
scripts/目录下,__DIR__指向的是该目录,所以引入 autoload 要写成require __DIR__ . '/../vendor/autoload.php'; - 脚本路径必须相对
composer.json所在目录,不是当前 shell 工作目录
为什么 new 类就报 Class not found
Composer 执行脚本时,**完全不加载项目 autoloader** —— 这不是 bug,是设计如此。它不关心你的命名空间或自动加载配置,只负责 fork 进程执行命令。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- PHP 脚本开头漏掉
require __DIR__ . '/vendor/autoload.php';(路径按实际调整)→ 必报错 - 写了
include 'vendor/autoload.php'但没算对相对路径 → 找不到文件 - 类已声明在
autoload-dev里,但运行时没加--dev或COMPOSER_DEV_MODE=1→ 加载失败 - 用
composer dump-autoload确保映射已生成,尤其是用了 PSR-4 但目录结构和命名空间不一致时
传参失败?先看那个 -- 分隔符
想把 --filter=MyTest 传给 PHPUnit,写成 composer test --filter=MyTest 是错的:Composer 会尝试解析这个参数,然后静默忽略或报错。
立即学习“PHP免费学习笔记(深入)”;
- 正确写法是:
composer test -- --filter=MyTest,第一个--是分隔符,告诉 Composer “后面全是子进程参数” - PHP 脚本里收参数别依赖
$_SERVER['argv'](索引偏移不可靠),优先读getenv('COMPOSER_ARGS')(Composer 4.0+ 提供) - 如果坚持用
$argv,记得array_shift($argv)去掉第一个元素(脚本路径),再处理后续参数 - Shell 脚本里用
"$@",且必须加双引号包裹,否则含空格的参数会被截断
容易被忽略的执行上下文细节
Composer 运行脚本时的工作目录永远是 composer.json 所在目录,PATH 只前置了 vendor/bin/,不会继承你 shell 里的完整 PATH。
- 调用
php-cs-fixer优先写vendor/bin/php-cs-fixer,而不是裸写php-cs-fixer - 脚本里执行
git或npm前,先用which git或command -v npm检查是否存在 - 权限问题常见于部署机:
storage/目录属主不是 Web 服务器用户,chmod在 Windows 下直接失效 - 用
"debug": "pwd && echo $PATH && which php && ls -l vendor/bin/"快速验证环境是否如预期


















