<p>Composer scripts 中 new 类报错是因为默认不加载 autoload.php,需手动引入;跨平台应避免 shell 命令,改用 PHP 封装;post-install-cmd 并非每次部署都执行,仅依赖变更时触发;传参须用 -- 分隔并用 array_slice($_SERVER['argv'], 2) 安全获取。</p>

scripts 里 new 类为什么报错
因为 Composer 执行 scripts 时默认不加载 vendor/autoload.php,new App\Services\Deployer() 这类调用必然失败——这不是路径写错,是设计如此。
必须在 PHP 脚本第一行手动引入 autoloader:
- 脚本在项目根目录:
require __DIR__ . '/vendor/autoload.php'; - 脚本在
scripts/目录下:require __DIR__ . '/../vendor/autoload.php'; - 加防护判断更稳妥:
if (!class_exists('Composer\Autoload\ClassLoader')) { die('autoload not loaded'); }
别用 include 或依赖 $_ENV,CLI 下 $_ENV 默认为空;也别指望 Composer 自动帮你加载命名空间。
怎么让 scripts 真正跨平台运行
写 rm -rf 或 del /q 是常见翻车点:Linux/macOS 和 Windows 的 shell 命令不兼容,CI 构建直接卡死。
推荐统一用 PHP 脚本封装,避免 shell 差异:
- 用
php scripts/clear-cache.php替代rm -rf bootstrap/cache/* - PHP 脚本内用
array_map('unlink', glob('bootstrap/cache/*'));或Filesystem::cleanDirectory() - 环境变量用
getenv('APP_ENV')判断,而不是靠 shell 的$APP_ENV
如果非要用 shell,Windows 用户必须加双引号:composer run "dev:serve",否则含冒号的命令名会被截断。
post-install-cmd 不等于“每次部署都执行”
这个钩子只在 composer install 成功、且 composer.lock 发生变更或 vendor/ 为空/不完整时才触发。CI 流水线中反复跑 composer install(lock 没变)时,它根本不会进。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
误把数据库迁移塞进去,会导致本地 composer update 意外改库,或 CI 构建镜像时连不上 DB 直接失败。
真正适合放这里的操作,得和依赖安装强绑定:
-
"post-install-cmd": ["@php vendor/acme/package/bin/init.php"]—— 仅当该包被装上才运行 -
"post-install-cmd": ["@php scripts/init-dev-env.php"]—— 脚本开头检查getenv('COMPOSER_DEV')防止污染生产 -
"post-install-cmd": "composer dump-autoload --optimize"—— 但不如直接用--optimize-autoloader参数可靠
想确保每次部署都跑某步?别靠钩子,显式调用:composer deploy:migrate --force,由 CI 步骤控制是否加 --force。
参数怎么传进 scripts 并安全拿到
漏掉 --,参数就没了。比如 composer test:unit -- --filter=testLogin,中间的 -- 是分隔符,不是可选的。
PHP 脚本里拿参数,别信 $argv[1] —— Composer 可能插入自己的参数导致偏移。更可靠的方式:
- 读
$_SERVER['argv'],跳过前两个元素(php和脚本路径) - 用
array_slice($_SERVER['argv'], 2)获取透传参数 - Shell 命令中别用
$1,Windows 不支持;统一走 PHP 封装
环境变量要显式注入:"dev:start": "APP_ENV=dev php -S localhost:8000 router.php" 在 Linux/macOS 有效,Windows 得写成 cmd /c "set APP_ENV=dev && php -S ..." —— 所以还是 PHP 脚本读 getenv() 最稳。

















