如何让 Composer 在执行 install 或 update 前运行预处理脚本(pre-install-cmd)?

3次阅读

Composer 支持 pre-install-cmd 和 pre-update-cmd 钩子,自 1.10+/2.0+ 起稳定可用,会在 install/update 开始前自动执行;需确保未使用 –no-scripts 且版本达标。

如何让 Composer 在执行 install 或 update 前运行预处理脚本(pre-install-cmd)?

Composer 本身不提供 pre-install-cmd 这样的原生脚本钩子,但你可以通过 scripts 配置 + composer install--no-scripts 行为,或借助插件 / 包装脚本实现“执行 install/update 前运行自定义逻辑”的效果。最实用、无需额外依赖的方式是利用 Composer 的 pre-autoload-dumppre-update-cmd/pre-install-cmd —— 等等,这里需要先澄清一个关键点:

Composer 实际支持的 pre-* 脚本有哪些?

官方文档明确列出的事件钩子中,确实存在 pre-install-cmdpre-update-cmd,它们会在 composer installcomposer update 命令开始执行(即解析依赖、下载包之前)被触发。

注意:这些钩子从 Composer 1.10+ 和 Composer 2.0+ 开始稳定支持,并在默认启用脚本时自动运行(即未加 --no-scripts)。

如何正确配置 pre-install-cmd / pre-update-cmd

在你的 composer.jsonscripts 字段中添加对应键即可:

  • pre-install-cmd:在 install 启动时、任何依赖操作前执行
  • pre-update-cmd:在 update 启动时、清理锁文件或计算差异前执行

示例配置:

{"scripts": {     "pre-install-cmd": [       "@php -r"echo '✅ Running pre-install checks……\n';"","php scripts/check-env.php"],"pre-update-cmd": ["@php -r "echo'⚠️  Clearing outdated caches before update……\n';"",       "php scripts/clean-cache.php"]   } }

✅ 运行 composer install 时,会先执行 pre-install-cmd 列表中的所有命令,再继续安装流程。

为什么 有时 pre-* 脚本没运行?

常见原因包括:

  • 你用了 composer install --no-scripts(显式禁用脚本)
  • Composer 版本过低(composer self-update
  • "scripts" 写在了错误位置(必须是根级字段,不能嵌套在其他字段下)
  • 脚本中某条命令退出码非 0,导致后续脚本中断(Composer 默认短路执行)

替代方案:更可控的预处理(适合复杂逻辑)

如果需要更强控制(比如根据参数跳过、记录日志、或与 CI 深度集成),可绕过钩子,改用包装脚本:

  • 写一个 ./bin/install.sh,内容为:
    #!/bin/bash
    php scripts/pre-check.php || exit 1
    composer install "$@"
  • CI 中直接调用该脚本,而非裸跑 composer install
  • 这样完全自主掌控顺序、错误处理和环境判断

这种方式不依赖 Composer 钩子机制,也避免了钩子执行时机的隐含约束(例如 pre-install-cmd 无法访问已生成的 vendor/autoload.php,因 autoloader 尚未生成)。

基本上就这些。用好 pre-install-cmdpre-update-cmd 是最轻量、最标准的做法,前提是 Composer 版本够新、配置位置正确、没加 --no-scripts。不需要装插件,也不用改全局行为。

星耀云
版权声明:本站原创文章,由 星耀云 2026-01-04发表,共计1522字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources