Composer脚本必须定义在composer.json顶层"scripts"对象中,键为脚本名,值为命令;需用composer run(2.2+)或composer run-script调用,不可直接执行;脚本不自动加载autoload,须手动引入vendor/autoload.php。

脚本定义在 composer.json 的 "scripts" 字段里
Composer 不会自动执行任意命令,所有自定义逻辑必须显式注册进 "scripts" 对象。这个字段是顶层键,和 "require" 同级,不是插件或扩展配置。
常见错误是把它写在 "extra" 或 "config" 下,结果完全不生效;或者拼错成 "script"(少个 s),Composer 会静默忽略。
-
"scripts"值必须是对象,键是脚本名(如"post-install-cmd"或自定义名"build-assets"),值可以是字符串命令、字符串数组、或对象(含"cmd"和"event") - 内置事件钩子(如
"pre-autoload-dump")名称严格区分大小写和连字符,查文档确认拼写,别靠记忆 - 自定义脚本名不能含空格或特殊符号,建议用小写字母+短横线,比如
"sync-config",避免"sync config"或"sync_config"
运行自定义脚本用 composer run 而不是 composer script
Composer 2.2+ 才支持 composer run;旧版本只能用 composer run-script。很多人卡在这一步,输错命令就提示“Command ‘script’ is not defined”。
注意:即使你定义了 "scripts": { "test-ci": "phpunit --no-coverage" },也**不能**直接敲 composer test-ci —— 那会被当作子命令解析,而 Composer 没注册这个命令。
自定义设置的程度更高可以满足大部分中小型企业的建站需求,同时修正了上一版中发现的BUG,优化了核心的代码占用的服务器资源更少,执行速度比上一版更快 主要的特色功能如下: 1)特色的菜单设置功能,菜单设置分为顶部菜单和底部菜单,每一项都可以进行更名、选择是否隐 藏,排序等。 2)增加企业基本信息设置功能,输入的企业信息可以在网页底部的醒目位置看到。 3)增加了在线编辑功能,输入产品信息,企业介绍等栏
- 正确调用方式:
composer run test-ci(新版本)或composer run-script test-ci(兼容老版本) - 想跳过交互提示(比如 CI 环境),加
--no-interaction参数,否则某些脚本可能卡住等待输入 - 如果脚本依赖其他包的二进制(如
php-cs-fixer),确保它已安装在vendor/bin/,且路径没被 shell 的$PATH覆盖掉
脚本中调用 PHP 类或函数需手动加载 autoload
Composer 脚本默认不在项目 autoloader 上下文中执行。直接写 MyClass::doSomething() 会报 Class 'MyClass' not found,哪怕类文件就在 src/ 下。
根本原因:脚本作为独立进程启动,不会自动 require vendor/autoload.php。别指望 Composer “帮你搞定”。
- 最简方案:在命令字符串开头加
php -d include_path=vendor/autoload.php -r "require 'vendor/autoload.php'; (new \App\Builder)->build();"—— 但太难维护 - 推荐做法:写一个独立的可执行 PHP 文件(如
scripts/build.php),顶部require __DIR__.'/../vendor/autoload.php';,然后在"scripts"中调用"php scripts/build.php" - 如果用闭包或匿名函数,记得用
use显式导入变量,$this在脚本中不可用
环境变量和参数传递容易漏掉引号或转义
脚本命令行里带空格、$ 符号或通配符时,shell 层会提前解析,导致传给 PHP 的参数残缺。比如 "deploy": "rsync -av ./dist/ user@host:/var/www/$APP_ENV/",$APP_ENV 在 Composer 执行前就被 shell 展开了,而不是留给 PHP 读取 getenv('APP_ENV')。
- 安全写法:用单引号包裹整个命令,或对变量加反斜杠转义,如
'rsync -av ./dist/ user@host:/var/www/$APP_ENV/' - 需要传参给脚本?用
composer run deploy -- --env=prod,然后在 PHP 脚本里用$argv或 symfony/console 解析,别试图在 JSON 里硬编码动态值 - Windows 用户注意:
%VAR%语法会被 cmd 提前替换,建议统一用 Unix 风格$VAR并配合 Git Bash 或 WSL 执行,避免跨平台故障
事情说清了就结束。脚本不是魔法,它只是把命令组织得更可控;真正的难点永远在环境一致性、路径假设和变量生命周期上。









