composer scripts 默认通过 php 运行时调度,非 shell 执行器;应避免直接写 shell 命令,改用跨平台 php 实现或独立脚本;仅适合放项目快捷入口、生命周期钩子和简单检查;自定义 script 名需 --no-dev 或 alias 才能作为 cli 别名使用。

scripts 里写命令别直接用 shell 语法
Composer 的 scripts 不是 shell 脚本执行器,它默认走的是 PHP 运行时调度。你写 "dev:clean": "rm -rf var/cache/*" 在 Windows 上大概率报错,因为 rm 不存在;即使在 Linux/macOS,也依赖系统 PATH 和当前工作目录是否准确。
更稳妥的做法是用 Composer 自带的 exec 或调用封装好的 PHP 命令:
- 优先用
composer exec包一层:比如"dev:clean": "composer exec 'rm -rf var/cache/*'" - 或者改用可跨平台的 PHP 实现:
"dev:clean": "php -r \"array_map('unlink', glob('var/cache/*')); rmdir('var/cache'); mkdir('var/cache');\"" - 如果命令较重,建议抽成独立 PHP 文件(如
bin/clean-cache.php),然后在 scripts 中写"dev:clean": "php bin/clean-cache.php"
别把 scripts 当作构建工具来用
很多人把 scripts 当成 npm scripts 或 Makefile 用,塞进一堆编译、压缩、上传逻辑——这会让 composer.json 膨胀且难维护,而且无法复用、调试困难。
真正适合放进 scripts 的,只有三类操作:
- 项目级快捷入口,比如
"test": "phpunit --configuration phpunit.xml" - Composer 生命周期钩子,如
post-install-cmd、pre-autoload-dump - 简单状态检查,例如
"check:env": "php -r \"if (!getenv('APP_ENV')) die('APP_ENV missing');\""
超过 2 行逻辑、涉及条件判断或错误恢复,就该移出 scripts,改用专用脚本或 Makefile。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
alias 要生效必须加 --no-dev 或全局注册
你写了 "scripts": {"cs": "php-cs-fixer fix"},但运行 composer cs 提示 “Command not found”,不是语法错,而是 Composer 默认只识别预定义命令名(如 install、update)和生命周期钩子。自定义 script 名称不会自动变成 CLI 别名。
让 composer cs 可用,有两个办法:
- 加
--no-dev参数启动(仅限本地开发):composer run-script cs --no-dev—— 但太长,不解决“快捷”问题 - 更实用的是用 Composer 插件:装
hirak/prestissimo没用,得用consolidation/cgr或直接升级到 Composer 2.5+,它支持通过composer.json的bin字段注册二进制别名(需配合bin-dir配置) - 最轻量方案:在 shell 的
.zshrc或.bashrc里加 alias:alias ccs='composer run-script cs --no-dev'
Windows 用户要注意路径分隔符和引号嵌套
Windows 下 CMD 和 PowerShell 对引号处理完全不同。比如这个写法:"build:zip": "zip -r build/app.zip src/ config/ --exclude=\"*.log\"",在 PowerShell 里双引号会被提前解析,导致 --exclude 参数失效。
实操建议:
- 统一用单引号包裹整个命令(CMD 不支持,但 Composer 2.x+ 在 Windows 上会自动 fallback 到 PowerShell 兼容模式)
- 避免嵌套引号,改用
^转义(CMD)或反引号(PowerShell),但更推荐绕过:把参数写进配置文件,命令只调用配置 - 测试务必在目标环境跑一次
composer run-script <name> --dry-run</name>,看实际展开的命令是否合理
跨平台脚本最难的不是功能,是让同一行 JSON 在三种 shell 下都展开成你预期的命令字符串。多试几次 --dry-run,比查文档管用。










