Composer脚本不会自动执行,必须显式触发:一是匹配内置事件钩子(如post-install-cmd),二是在命令行运行composer run <name>或简写composer <name>。

脚本不会自动执行,必须明确触发
加进 composer.json 的 scripts 段不等于“部署即生效”。只有两类情况会自动运行:一是匹配 Composer 内置事件钩子(如 post-install-cmd),二是你手动执行 composer run <name> 或简写 composer <name>。
常见误判:"build": "npm run build" 这种自定义名,不调用就不会跑;composer install 也不会顺手帮你执行它。CI 环境里还常带 --no-scripts,此时所有钩子(包括 post-*)全被跳过,静默失效。
- 想让命令自动跑 → 必须用
pre-*/post-*事件名,不能自己乱起名 - 想临时调试或手动触发 → 用
composer run build,别再用已弃用的composer run-script build - 脚本名若与 Composer 命令同名(如
"install": "echo hi"),composer install仍走原逻辑,不会执行你的脚本
传参必须用双横线 -- 分隔
想给脚本传参(比如过滤 PHPUnit 用例),直接写 composer run test --filter=testFoo 是错的——--filter 被 Composer 当作自身参数解析,phpunit 根本收不到。
正确写法是加 -- 显式分隔:composer run test -- --filter=testFoo。这是 Unix shell 通用约定,不是 Composer 特有语法。
- 漏掉
--,参数就卡在 Composer 层,下游命令收不到 - 数组形式脚本(如
["@php vendor/bin/phpunit", "--colors=always"])里不能带--,那是运行时才需要的 - PHP 回调脚本中想读原始参数?别依赖
$_SERVER['argv']—— Composer 会过滤,不可靠
事件钩子选错,逻辑就错位
post-install-cmd 和 post-update-cmd 行为在 Composer 2.2+ 已收紧:前者只在 composer install 显式执行时触发,composer update 不会触发它;而 composer require xxx 本质是 update 流程,只走 post-update-cmd。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
典型错配:post-install-cmd 里放生成 autoload 文件的逻辑,结果 composer update 后类找不到——因为 autoload 没刷新。
- 跟自动加载相关的操作(如 classmap 生成、dump autoload),优先用
post-autoload-dump,它更精准、触发时机更稳定 -
post-root-package-install只在项目首次安装时触发,不适合常规初始化(比如密钥生成应放post-install-cmd或post-update-cmd) - 同时配了
post-install-cmd和post-autoload-dump,又都在脚本里调composer dump-autoload,会导致重复执行、浪费时间
PHP 回调脚本要注意环境和路径
PHP 回调(如 "post-autoload-dump": "MyClass::doSomething")默认不加载项目 autoloader,也不能直接用 new MyClass(),除非显式 require 或配置 autoload。
另外,所有脚本都在项目根目录执行,但 getcwd() 可能被 symlink、Docker volume 挂载等干扰,./bin/script.php 容易找不到。
- 判断是否启用 dev 依赖:用
getenv('COMPOSER_DEV_MODE') === '0',而不是硬编码phpunit命令——否则--no-dev下直接报sh: phpunit: not found - 跨平台安全读环境变量:Windows 不认
$PATH,改用php -r "echo $_ENV['PATH'] ?? '';" - 依赖 vendor 二进制?写成
php ./vendor/bin/phpcs比vendor/bin/phpcs更稳,避免 PATH 或当前目录影响
实际项目中最容易忽略的是钩子语义的细微差别——post-install-cmd 不等于“每次装完都跑”,post-update-cmd 也不等于“每次改依赖都重刷缓存”。时机错了,逻辑再对也白搭。

















