composer脚本本身不支持if-else语法,所有条件逻辑必须交由外部命令(如php、shell)在运行时判断;轻量逻辑可用shell条件语句(仅限linux/macos),复杂逻辑应使用独立php脚本,并通过composer_script_app_env等环境变量安全传参。

Composer脚本本身不支持if-else语法
不能在composer.json的scripts字段里直接写if [ "$APP_ENV" = "dev" ]; then ... fi这种逻辑——它只是 JSON 配置文件,不是 Shell 脚本。所有“条件触发”都必须交由外部命令(PHP、Shell、Node.js 等)在运行时判断。
用 shell 条件语句做简单分支(Linux/macOS 有效)
适合单行、轻量逻辑,比如只在本地生成密钥:
-
post-root-package-install这类事件只在create-project时触发,普通install不会执行,别误配到post-install-cmd - 写法必须是完整 shell 语法:
"php artisan key:generate"前面加if [ "$APP_ENV" = "local" ]; then ... fi,不能漏掉then和fi - Windows CMD 下
if语法不兼容,得用 PowerShell 或改用 PHP 脚本 - 环境变量默认不透传,
$APP_ENV为空——得显式前置注入:APP_ENV=local composer install,或用COMPOSER_SCRIPT_APP_ENV=local(Composer 原生支持)
用独立 PHP 脚本处理复杂条件
这是最可靠的方式,能读文件、查数据库、调 API、组合多条件:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 脚本路径要写对,比如
scripts/deploy.php,并在composer.json中声明:"deploy": "php scripts/deploy.php" - 别依赖
$_ENV:Composer 启动的 PHP 进程默认不填充它;统一用getenv('COMPOSER_SCRIPT_APP_ENV') ?: 'prod' - 如果要用
.env,必须手动加载:Dotenv\Dotenv::createImmutable(__DIR__)->load();,且确保vlucas/phpdotenv已安装(不能在autoload.files里加,会循环依赖) - 避免硬编码路径:
file_exists('config/dev.php')可能失败,因为当前工作目录不一定是项目根——建议用dirname(__DIR__) . '/config/dev.php'
为什么post-install-cmd有时不执行或执行两次
这不是脚本问题,是事件触发规则被混淆了:
-
composer install→ 只触发post-install-cmd,不触发post-update-cmd -
composer update或composer require→ 只触发post-update-cmd,不触发post-install-cmd - 想让 autoload 更新后一定执行某逻辑(比如清理缓存),该用
post-autoload-dump,它比post-install-cmd更精准、更稳定 -
post-root-package-install和post-create-project-cmd仅限create-project场景,日常开发几乎用不到
真正容易被忽略的是环境变量注入方式:无论用 shell 判断还是 PHP 脚本,APP_ENV=dev composer run xxx在 Windows 上基本无效;CI 流水线里不显式声明COMPOSER_SCRIPT_APP_ENV,脚本里就永远读不到。条件逻辑本身不难,难的是让变量稳稳落到脚本进程里。










