Composer scripts 是轻量命令别名,适合依赖绑定的单点操作(如dev初始化、缓存清理、代码检查、资产构建),不适用于流程编排或强制部署任务;需手动加载autoloader、透传参数用--、跨平台用PHP封装脚本。

Composer scripts 不是部署工具,但能可靠支撑部署前后的轻量自动化——关键在于分清哪些该放 scripts、哪些必须交给 CI/CD 或独立脚本。
哪些任务适合放进 scripts 字段
scripts 本质是命令别名注册表,适合做「单点、可复用、上下文明确」的轻量操作。它不处理流程编排,也不保证失败中断,所以得挑对场景。
- 开发环境初始化:
post-install-cmd调用php scripts/init-dev-env.php,且脚本开头检查getenv('COMPOSER_DEV')防止污染生产 - 缓存清理与配置预热:
deploy:clear-cache封装php artisan cache:clear && php artisan config:cache,避免本地误跑生产命令时漏掉if (getenv('APP_ENV') === 'prod')判断 - 代码质量门禁:
ci:lint执行php -l+php-cs-fixer check,用数组写法更清晰:["php -l src/", "php-cs-fixer check --dry-run"] - 构建产物生成:
build:assets调用npm run build或php scripts/build-assets.php,后者可加try/catch和日志,比 shell 拼接更可控
为什么 post-install-cmd 不等于“每次部署都执行”
这个钩子只在 composer install 成功安装依赖后触发,且有隐含前提:lock 文件变更、vendor 目录为空或不完整。CI 流水线中重跑 composer install(无 lock 变更)时,它根本不会进。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 常见误用:
"post-install-cmd": "php artisan migrate"→ 导致 CI 构建镜像时意外改库 - 真正适合放这里的,是和依赖强绑定的操作,比如:
"post-install-cmd": ["@php vendor/acme/package/bin/init.php"],仅当该包被安装才运行 - 想确保每次部署都执行某步?别依赖钩子,显式调用:
composer deploy:migrate --force,由运维或 CI 步骤控制是否加--force
PHP 脚本里 new 类报错的根源与解法
Composer 执行 scripts 时默认不加载项目 autoloader,new AppServicesDeployer() 必然失败——这不是路径问题,是设计隔离。
- 最稳妥做法:在 PHP 脚本第一行写
require __DIR__ . '/../vendor/autoload.php';(注意__DIR__指向脚本所在目录,不是项目根) - 别用
include 'vendor/autoload.php',路径易错;也别依赖$_SERVER['PWD'],它不可靠 - 若脚本放在
scripts/下,且已声明进autoload-dev的psr-4,可用类方法回调:"health:check": "App\Scripts\HealthCheck::run",前提是composer dump-autoload已执行 - 调试时加一句:
if (!class_exists('ComposerAutoloadClassLoader')) { die('autoload not loaded'); },快速定位加载失败点
参数透传和跨平台执行的坑
Composer 不解析参数,只负责用 -- 分隔并透传。漏掉它,参数就被 Composer 当作自己的选项吞掉。
- 正确调用:
composer test:unit -- --filter=testLogin,实际执行的是phpunit --filter=testLogin - Windows 用户注意:
ci:lint这类含短横线的命令名,必须加双引号:composer run-script "ci:lint",否则解析失败 - 想在脚本里读参数?别用
$1或$@—— Windows CMD 不支持。统一用 PHP 封装:"test:group": "php scripts/run-test.php",再在 PHP 中处理$argv - 环境变量别依赖
$_ENV(CLI 下默认为空),显式导出:"dev:start": "APP_ENV=dev php -S localhost:8000 router.php",或交由 PHP 脚本用getenv()读取
真正容易被忽略的,是 scripts 的执行时机与上下文边界——它不自动加载 autoloader、不接管工作路径、不校验命令是否存在。写完别急着跑,先用 composer run-script xxx --dry-run 看解析结果,再确认脚本里所有路径、类引用、环境判断都落在预期上下文中。

















