You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 allowEmpty option)

错误原因

  • 工作目录不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:20:59