Composer怎么运行脚本 Composer怎么执行自定义命令【扩展】

2次阅读

composer 运行自定义脚本需用 composer run 命令名,传参必须加 — 分隔(如 composer run test:unit — –Filter=testfoo),脚本中引用环境变量应使用 $varlinux/macos)或 php -r 跨平台兼容。

Composer怎么运行脚本 Composer怎么执行自定义命令【扩展】

Composer 运行脚本靠 composer runcomposer run-script,但默认不支持带参数的自定义命令——得手动加 -- 分隔符,否则参数会被 Composer 吞掉。

怎么用 composer run 执行自定义脚本

你在 composer.json"scripts" 里定义的键名,就是可直接运行的命令名。比如:

"scripts": {   "build": "php build.php",   "test:unit": "phpunit --testsuite=unit" }

执行时不用写完整路径或命令,只输名字就行:

  • composer run build → 触发 php build.php
  • composer run test:unit → 等价于 phpunit --testsuite=unit
  • 别用 composer run-script build,那是旧写法,run 更统一、更推荐

为什么传参总失败?关键在 --

想给脚本传参(比如 phpunit --filter=testFoo),直接写 composer run test:unit --filter=testFoo 是错的——Composer 会把 --filter 当成自己的选项,报错或静默忽略。

  • 必须加 -- 显式分隔: composer run test:unit -- --filter=testFoo
  • 这个 -- 不是 Composer 的语法糖,是 unix shell 通用约定,告诉前面的命令“后面全是传给子进程的参数”
  • 漏掉它,phpunit 根本收不到 --filter,只会跑全部用例

composer.json 脚本里怎么引用环境变量或动态值

脚本字段本身支持简单变量展开,但仅限 Composer 内置变量(如 ${COMPOSER_HOME})和 shell 环境变量(需用 $VAR${VAR}):

  • "scripts": { "debug": "echo $PATH" } → 在 Linux/macOS 下生效,windows CMD 不认 $
  • 跨平台安全写法是用 php -r "echo $_ENV['PATH'] ?? 'no path';"
  • 避免在脚本里硬编码路径,比如 vendor/bin/phpcs,改用 ./vendor/bin/phpcsphp ./vendor/bin/phpcs,防止当前目录影响执行
  • 如果脚本依赖其他 Composer 命令(如 composer dump-autoload),建议显式调用,别假设它已执行

最常被忽略的是 Windows 用户没意识到 $PATH%PATH% 不互通,以及脚本中混用单双引号导致变量不展开——这些不会报错,但行为和预期完全不同。

text=ZqhQzanResources