composer脚本中用@other-script可调用同scripts下的其他脚本,必须定义在根级scripts对象内,大小写敏感,不支持嵌套字段或传参;@前缀仅用于引用scripts键值,否则按shell命令执行。

Composer脚本里怎么调用另一个脚本
直接在 scripts 中用 @other-script 语法即可,Composer 会自动识别并执行同配置里的其他脚本,不需要写完整命令或路径。
比如你在 composer.json 里定义了 "build": "npm run build",又想在 post-install-cmd 里触发它,就写成:
"post-install-cmd": ["@build"]
注意:多个命令用数组,单个可写字符串;@xxx 只能引用 scripts 下已声明的键名,不能是任意 shell 命令。
为什么 @xxx 不生效或报错“Script xxx is not defined”
常见原因不是拼写错误,而是脚本定义位置不对——必须在根级 scripts 对象里,不能嵌套在 scripts-dev 或其他自定义字段中。
以下写法会失败:
"scripts-dev": { "test-ci": "phpunit" },<br>"scripts": { "ci": "@test-ci" } // ❌ test-ci 不在 scripts 下,无法被 @ 引用
正确做法是统一收口到 scripts:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 把所有可复用脚本都平铺在
scripts顶层 - 避免用子对象分组(如
scripts-dev),Composer 不解析那些字段 - 检查大小写:@Build 和 @build 是两个不同脚本
能否在脚本里调用外部命令而不是其他 Composer 脚本
可以,但别混用 @ 前缀。直接写命令就行,比如 "clear-cache": "rm -rf var/cache/*"。
关键区别:
-
@xxx→ 查找并执行scripts.xxx的值 -
xxx(无 @)→ 当作 shell 命令执行,走系统 PATH 或当前目录 - 混合使用没问题:
"dev-setup": ["@install", "npm install"]
注意 Windows 用户:内置命令如 rm、mkdir -p 在 CMD/PowerShell 下不可用,建议用 cross-env 或改用 PHP 脚本封装。
脚本执行顺序和变量传递有没有坑
Composer 不支持脚本间传参,@xxx arg1 arg2 这种写法会被忽略参数,只执行 xxx 对应的原始命令。
如果需要动态行为,有三个实际可用方案:
- 用环境变量临时透传:
"build:prod": "APP_ENV=prod @build",然后在build脚本里读$_ENV['APP_ENV'](PHP)或$APP_ENV(shell) - 把逻辑拆成独立 PHP 文件,用
php script.php --env=prod显式传参 - 避免嵌套调用,直接在目标脚本里用条件判断,比如
"build": "if [ \"$APP_ENV\" = \"prod\" ]; then ...; else ...; fi"
另外,post-* 类钩子默认不继承前一个脚本的 exit code,出错也不会中断流程,这点容易被忽略。










