使用Gulp 5.0.0从两级上级目录复制文件时遇文件未找到错误
解决Gulp 5.0.0读取上级目录文件报错的问题
问题重现
使用Gulp 5.0.0编写theme任务时,尝试读取上级目录的../../docs/theme/theme.js文件(文件实际存在),但执行任务时报错:
Error: File not found with singular glob: D:/Sources/Karnama/docs/theme/theme.js (if this was purposeful, use `allowEmpty` option)
修改gulp.src的base参数为./后问题仍未解决,仅当文件位于同目录或子目录时任务正常执行。
原任务代码:
gulp.task("theme", async () => { const destBasePath = "src/assets/vendors/theme/"; gulp.src(["../../docs/theme/theme.js"]) .pipe(uglify()) .pipe(concat("theme.min.js")) .pipe(gulp.dest(destBasePath)); });
解决方案
1. 改用绝对路径读取文件
Gulp 5对跨目录相对路径的解析存在匹配问题,使用Node.js的path模块生成绝对路径可彻底避免这个问题:
const path = require('path'); gulp.task("theme", () => { const destBasePath = "src/assets/vendors/theme/"; // 基于gulpfile所在目录生成目标文件的绝对路径 const srcFilePath = path.resolve(__dirname, '../../docs/theme/theme.js'); return gulp.src([srcFilePath]) .pipe(uglify()) .pipe(concat("theme.min.js")) .pipe(gulp.dest(destBasePath)); });
2. 确保任务正确处理异步流
原任务使用async函数但未返回流或等待流完成,导致Gulp提前结束任务,进而引发文件读取异常。可以通过两种方式修复:
- 直接返回流:去掉
async关键字,返回gulp流(推荐写法) - 异步等待流完成:用
stream.pipeline将流处理包装为Promise等待执行完毕
示例(异步等待写法):
const { promisify } = require('util'); const pipeline = promisify(require('stream').pipeline); const path = require('path'); gulp.task("theme", async () => { const destBasePath = "src/assets/vendors/theme/"; const srcFilePath = path.resolve(__dirname, '../../docs/theme/theme.js'); await pipeline( gulp.src([srcFilePath]), uglify(), concat("theme.min.js"), gulp.dest(destBasePath) ); });
3. 验证路径正确性
可以先通过console.log输出解析后的绝对路径,确认路径是否指向正确文件:
console.log(path.resolve(__dirname, '../../docs/theme/theme.js'));
运行任务前检查输出路径与实际文件路径是否一致,排查拼写或层级错误。
内容的提问来源于stack exchange,提问作者Mohammad Dayyan
相关产品推荐
相关产品推荐

