gulp - 如何使用 Gulp 解压缩同一文件夹中的多个文件
问题描述
我想解压缩单个文件夹中的多个 zip 文件。每个解压后的文件都将解压到与原始 zip 文件同名的文件夹中,并作为子文件夹添加到包含原始 zip 的原始文件夹中。
像这样的东西:
parent(folder)
-a.zip
-b.zip
-c.zip
会成为:
parent(folder)
-a(folder)
--a.zip contents here
-b(folder)
--b.zip contents here
-c(folder)
--c.zip contents here
我相信我到目前为止的代码是一个不错的尝试,但似乎它在管道中异步执行(我显然不是 Gulp 专家)。正在查看所有 zip 文件,但似乎只有最后一个文件获取了所有内容,然后是其他 zip 文件中的一些。使用文件夹中的一个 zip 文件运行它,它可以完美运行。
var zipsPath = 'src/';
var currentZipFileName;
function getZips(dir) {
return fs.readdirSync(dir)
.filter(function (file) {
return file.indexOf(".zip") > 0;
});
}
gulp.task('init', function (done) {
var zips = getZips(zipsPath);
var tasks = zips.map(function (zip) {
console.log("zip", zip, path.join(zipsPath, zip));
return gulp.src(path.join(zipsPath, zip), {
base: '.'
})
.pipe(tap(function (file, t) {
currentZipFileName = path.basename(file.path);
}))
.pipe(unzip({ keepEmpty : true }))
.pipe(gulp.dest(function (path) {
var folderName = currentZipFileName.replace(".zip", "");
var destination = "./src/" + folderName;
//console.log("destination", destination);
return destination;
}))
.on('end', function() {
console.log('done');
done();
});
});
return tasks;
});
预期结果:应解压缩所有 zip 文件。实际结果:大部分内容都被转储到最后查看的 zip 文件中。谢谢您的帮助
解决方案
你的问题出在这里:
.pipe(tap(function (file, t) {
currentZipFileName = path.basename(file.path);
}))
您正在尝试在一个管道中设置一个变量以在以后的管道中使用。这不起作用,这里有一些关于它的问题,但它只是不起作用 - 当 gulp.dests 开始触发或未定义时,您的变量可能会有最后一个值 - 我认为它是基于不可预测的定时。
在任何情况下,您都不需要设置该变量 - 您zips.map(zip) {}
的zip
项目中已经有了所需文件夹名称的值。你可以用它gulp.dest
就好了。
gulp.task('init', function (done) {
var zips = getZips(zipsPath);
var tasks = zips.map(function (zip) {
return gulp.src(zipsPath + "/" + zip)
// .pipe(tap(function (file, t) {
// currentZipFileName = path.basename(file.path);
// }))
.pipe(unzip({ keepEmpty: true }))
.pipe(gulp.dest(path.join("src", path.basename(zip, ".zip"))))
.on('end', function() {
done();
});
});
return tasks;
});
由于此处所述的原因,还要避免path.join
在您的文件中使用: gulpjs docs on glob separators:gulp.src
glob 中的分隔符始终是
/
字符(无论操作系统如何),即使在路径分隔符所在的 Windows 中也是如此\\
。在 glob 中,\\
保留为转义字符。避免使用 Node 的路径方法(例如 path.join)来创建 glob。在 Windows 上,它会产生一个无效的 glob,因为 Node
\\
用作分隔符。出于同样的原因,还要避免使用 __dirname global、__filename global 或 process.cwd()。
推荐阅读
- visual-c++ - 如何使用其他预处理器指令定义宏?
- postgresql - 忽略 Postgres 插入中不存在的列?(用于开发目的)
- javascript - JavaScript 警报未显示在浏览器页面中,但显示在屏幕右侧
- marklogic-corb - MarkLogic CORB - 如何在运行 corb 时避免超时
- matlab - matlab deploytool 生成的独立应用程序/使用 OPC 编译在主机系统中失败
- java - Spring Integration Java DSL 使用多个“.channel()”的行为
- sql - ms-access sql-query 中是否有可以提取某个字符串的函数?
- typescript - 如何使用动态字段名称创建 Formik YUP 模式?
- spring-boot - 关于将 spring-data-rest-hal-browser 依赖项添加到我的 Spring Boot 应用程序(v 2.2.4)-我的应用程序无法启动。如何修复它?
- ionic-framework - Ionic 4 拦截 android 后退按钮进行导航