调整Makefile命令顺序时出现未定义命令错误求助
解决Makefile中
dependencies: Command not found错误并调整命令执行顺序 看起来你遇到的问题核心是没搞对Makefile的语法规则,尤其是目标定义、依赖关系和命令执行的格式要求。我帮你拆解问题并给出修复方案:
问题根源分析
你原Makefile的写法有几个关键错误:
- 目标与命令混淆:比如
dependencies: ./fetch-dependencies.sh,你把脚本当成了目标的依赖,而非要执行的命令。Makefile会误以为./fetch-dependencies.sh是一个需要先完成的目标,而不是直接运行它。 - Gulp目标定义错误:
gulp: gulp --production NODE_ENV=production webpack --progress同样有误,你把gulp命令当成了目标的依赖,Makefile会尝试寻找名为gulp --production...的目标,这显然不存在,进而触发错误。 - 缺少明确的前置执行逻辑:你需要在
dependencies和gulp之前运行php artisan,但原写法没有建立正确的依赖链来保证执行顺序。
修复后的Makefile示例
.PHONY: all dependencies gulp build build2 php-artisan-prep # 前置步骤:先执行php artisan命令(替换成你实际需要的命令) php-artisan-prep: php artisan your-specific-command-here # 依赖安装目标:先跑php artisan,再执行脚本 dependencies: php-artisan-prep ./fetch-dependencies.sh # Gulp构建目标:先跑php artisan,再执行gulp命令 gulp: php-artisan-prep gulp --production NODE_ENV=production webpack --progress # 默认构建目标 all: dependencies gulp # 原build目标(保持你的原有逻辑) build: dependencies gulp # 修复后的build2目标 build2: dependencies gulp
关键修复点说明
- 强制前置执行
php artisan:新增php-artisan-prep目标专门处理php artisan命令,让dependencies和gulp都依赖它,确保这两个目标执行前一定会先跑完php artisan。 - 修正目标的命令格式:所有要执行的命令必须放在目标名称下方,并且用Tab键缩进(绝对不能用空格,Makefile对这个要求非常严格)。
- 明确PHONY目标:保持
.PHONY声明所有虚拟目标,避免Makefile把目标名当成实际文件去检查更新时间。
验证方法
保存修复后的Makefile,然后执行:
make build2
现在应该会先执行php artisan命令,接着跑dependencies的脚本,最后执行gulp构建,不会再出现Command not found的错误。
内容的提问来源于stack exchange,提问作者Jesus Galvan
相关产品推荐
相关产品推荐

