Gulp glob匹配异常:文件存在却提示找不到的问题排查
Gulp Glob 匹配错误排查与解决
问题场景
你编写的Gulp任务如下:
function negativeGlobTest(){ return src(["./src/**/*.js", "!./src/pop/*.js", "./src/pop/twopac.js"]) .pipe(ugli()) .pipe(rename({extname : ".min.js"})) .pipe(dest("./superOutput")) }
执行ls -lR src得到的目录结构:
src: total 1 -rw-r--r-- 1 terminator 197121 395 Apr 5 14:31 index.js drwxr-xr-x 1 terminator 197121 0 Apr 5 18:43 pop/ src/pop: total 2 -rw-r--r-- 1 terminator 197121 133 Apr 5 18:30 mao.js drwxr-xr-x 1 terminator 197121 0 Apr 5 14:30 pom/ -rw-r--r-- 1 terminator 197121 154 Apr 5 18:34 twopac.js src/pop/pom: total 1 -rw-r--r-- 1 terminator 197121 29 Apr 5 18:27 index.js
运行任务时触发错误:
Error: File not found with singular glob: C:/my-github-repo/master/src/pop/twopac.js (if this was purposeful, use
allowEmptyoption)
错误原因
- 工作目录不匹配:Gulp中
src的相对路径基于运行命令时的当前工作目录,而非Gulpfile所在目录。如果你在C:/my-github-repo/而非C:/my-github-repo/master/下执行命令,./src/pop/twopac.js会指向错误路径,导致文件找不到。 - 路径鲁棒性不足:直接使用相对路径易受工作目录影响,且未适配不同系统的路径分隔符。
- 插件拼写错误:代码中的
ugli()应为uglify()(对应gulp-uglify插件),虽不是当前报错的直接原因,但会导致后续任务执行失败。
解决方法
方法一:切换到正确目录运行命令
打开终端,切换到Gulpfile所在的目录后执行任务:
cd C:/my-github-repo/master/ gulp negativeGlobTest
方法二:使用绝对路径(基于Gulpfile位置)
借助Node.js的path模块和__dirname(当前Gulpfile的绝对路径)构建路径,彻底避免工作目录影响:
const { src, dest } = require('gulp'); const uglify = require('gulp-uglify'); // 确保已安装:npm install gulp-uglify --save-dev const rename = require('gulp-rename'); const path = require('path'); function negativeGlobTest(){ return src([ path.join(__dirname, 'src/**/*.js'), '!' + path.join(__dirname, 'src/pop/*.js'), path.join(__dirname, 'src/pop/twopac.js') ]) .pipe(uglify()) .pipe(rename({extname : ".min.js"})) .pipe(dest(path.join(__dirname, 'superOutput'))) } exports.negativeGlobTest = negativeGlobTest; // Gulp 4需显式导出任务
方法三:优化glob规则
简化匹配逻辑,直接排除src/pop下除twopac.js外的所有JS文件:
src([ path.join(__dirname, 'src/**/*.js'), '!' + path.join(__dirname, 'src/pop/!(twopac).js') ])
其中!(twopac).js是glob的否定模式,代表匹配src/pop目录下除twopac.js之外的所有JS文件。
内容的提问来源于stack exchange,提问作者John Clarkson
相关产品推荐
相关产品推荐

