讲师中心 微信公众号
AI工具推荐 视频效率加速

Composer run-script命令自动化执行自定义 PHP 脚本与钩子任务

千静君_4522

千静君_4522

发布时间:2026-06-19 08:45:43

|

269人浏览过

|

来源于php中文网

原创

composer run-script 脚本未执行,主因是未显式调用或配置错误:脚本名拼写/大小写/位置(必须在 scripts 字段顶层)不符、未定义在 composer.json 中,或路径/环境/参数传递不当。

composer run-script命令自动化执行自定义 php 脚本与钩子任务

composer run-script 为什么脚本没执行

脚本没执行,基本是因为你没真正触发它——composer run-script 不是“保存配置就自动跑”,它只响应显式调用,且严格依赖 composer.json 中的定义位置和拼写。

常见错误现象包括:

  • Script not found: xxx:脚本名大小写不一致、多空格、用了中文标点,或被意外注释掉
  • 命令敲对了但无输出:脚本值写在 extra 或 config 下(必须在顶层 scripts 字段)
  • 本地能跑 CI 报 command not found:脚本里直接调 phpunit,但没走 vendor/bin/phpunit,CI 环境 PATH 没配全局二进制

验证是否生效最简单的方法是运行 composer run-script --list,它会列出所有已注册的脚本名,没出现在这里就等于没定义成功。

PHP 脚本里怎么安全加载项目类

直接 new App\Console\DeployCommand() 会报 Class not found,因为 composer run-script 默认不引入 vendor/autoload.php —— 这不是 bug,是隔离设计。

立即学习“PHP免费学习笔记(深入)”;

正确做法是在 PHP 脚本开头手动加载:

require_once __DIR__ . '/../../vendor/autoload.php';

注意路径要对:__DIR__ 是脚本所在目录,不是 composer.json 目录;如果脚本放在 scripts/deploy.php,那 ../../vendor/autoload.php 才是正确的相对路径。

其他要点:

  • 别用 include 单个类文件,容易漏依赖或版本错乱
  • 不要依赖 $_ENV,环境变量需显式读取:getenv('APP_ENV') 或通过 $_SERVER['COMPOSER_ARGS'] 接收传参
  • 如果脚本需要访问 composer.json 内容,用 file_get_contents(__DIR__ . '/../../composer.json') 解析,别硬编码配置

钩子(如 post-install-cmd)和自定义脚本名混用时的陷阱

你写了 "post-install-cmd": "php scripts/install.php",又另定义了 "deploy": "php scripts/deploy.php",结果发现 composer install 后 install.php 没跑——大概率是钩子名拼错了。

Academic Composer Upload
Academic Composer Upload

辅助学术写作,包括查找资料、生成大纲、引用扩写及润色风格,同时确保引用规范。

下载

内置钩子名严格区分大小写和连字符,比如:

  • post-install-cmd ✅(标准写法)
  • postinstallcmd ❌(Composer 静默忽略)
  • PostInstallCmd ❌(大小写不匹配)

另外要注意执行顺序和失败行为:

  • pre-* 钩子失败 → 主命令(如 install)立即中止
  • post-* 钩子失败 → 默认只警告,主流程继续,除非加了 --no-interaction 或设置了 COMPOSER_NO_INTERACTION=1
  • 多个脚本共用一个钩子时,用数组写法:"post-update-cmd": ["MyScript::clearCache", "php artisan config:clear"],顺序执行,前一个失败则后一个跳过

参数怎么透传给 PHP 脚本

想让 composer run-script test -- --filter=MyTest 中的 --filter=MyTest 真正被脚本拿到,关键在双横线 -- 的位置和脚本内的接收方式。

错误写法:composer run-script test --filter=MyTest → --filter 被 Composer 当作自身参数吃掉了。

正确写法必须带分隔符:composer run-script test -- --filter=MyTest。

在 PHP 脚本里,推荐用以下方式获取参数:

  • Composer 4.0+ 提供 $_SERVER['COMPOSER_ARGS'],返回已解析的参数数组,最可靠
  • 兼容旧版可 fallback 到 getenv('COMPOSER_ARGS')(字符串,需 explode(' ', ...))
  • 避免直接用 $argv,索引可能偏移(Composer 会往前面塞自己的参数)

Windows 用户特别注意:CMD 下双引号必须全角或转义,否则 composer run-script "test -- --filter=Foo" 会被截断;PowerShell 更稳妥。

最常被忽略的一点:脚本执行时工作目录(cwd)固定为 composer.json 所在目录,不是脚本所在目录。路径相关的操作(如读配置、写日志)务必基于这个前提写相对路径,否则本地测试通过、CI 上就出错。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

11664

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6721

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2175

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

4268

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4974

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3911

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5637

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4402

2023.11.13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn