scripts字段仅是触发点,真正省时在于将高频操作固化为可复用、可传递、可审计的命令;轻量操作可用scripts封装,复杂逻辑须拆至独立脚本或symfony/console工具。

composer.json 的 scripts 字段不是“工具箱”,它只是触发点——真正省时间的,是把高频、带上下文的操作固化成可复用、可传递、可审计的命令,而不是堆砌一堆 shell 片段。
用 scripts 字段定义轻量命令,但别塞逻辑
适合单步、无参数、跨平台安全的操作,比如 dump-autoload -o 或 phpunit。错误在于把它当 shell 脚本编辑器用:
- 写
"dev:setup": "composer install && php artisan key:generate && npm install":失败不中断、输出混杂、无法传参、Windows 直接报错 - 正确做法是新建
bin/dev-setup(加chmod +x),内容为实际多步逻辑;再在scripts里写"dev:setup": "bin/dev-setup" -
@php和@composer必须用:它们确保调用的是当前项目上下文里的 PHP / Composer 可执行文件,避免系统默认版本(如 Ubuntu 的php8.1)和项目要求(如php8.3)不一致
复杂逻辑必须拆到独立 PHP 脚本或 symfony/console 命令
需要参数(--env=prod)、确认提示、环境判断、或复用到多个项目时,scripts 就扛不住了。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- PHP 脚本要手动加载 autoloader:
require_once __DIR__.'/../../vendor/autoload.php';,否则连Composer\Script\Event都找不到 - 用
symfony/console写 CLI 工具更稳:运行composer require --dev symfony/console,写个bin/my-cli入口,再在scripts里注册"cli": "php bin/my-cli" - 别在脚本里调用
exec('composer install')——会递归触发自己,卡死 - 读配置统一走
composer.json的extra字段,比如"extra": {"deploy-target": "staging"},别污染config或scripts
post-install-cmd 和 post-update-cmd 不是部署钩子
它们只在 composer install 或 composer update 成功后触发,且默认不加载 autoloader、不注入环境变量、CI 常加 --no-scripts 直接跳过。
-
post-install-cmd适合首次初始化(如生成.env),但别放数据库迁移——万一某次没跑,线上就 stale -
post-update-cmd更适合本地开发同步状态,而非线上部署 - 远程部署必须显式
ssh user@host 'cd /path && composer install --no-dev',不能只写composer install -
post-autoload-dump是唯一可靠时机:自动加载文件已生成,autoloader 可用,适合生成代理类、清理缓存等
Docker 和 CI 中的 composer install 必须加三个参数
不加就等于裸奔:
-
--no-dev:排除开发依赖,减小镜像体积,避免生产环境装上phpunit这类工具 -
--optimize-autoloader:生成优化后的 classmap,提升加载性能 -
--classmap-authoritative:告诉 autoloader “所有类都在 classmap 里”,跳过文件系统扫描,进一步提速 - CI 中还应挂载 Composer 缓存:
RUN --mount=type=cache,target=/root/.composer/cache composer install,否则每次重下包
$_ENV、不处理 Windows/Linux 差异。所有“看似能跑”的 shell 片段,一旦换环境或进 CI,大概率翻车。










