如何使用 Gulp 将多个文件解压到同一文件夹中

2024-01-22

我想解压缩单个文件夹内的多个 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) {} the 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在你的gulp.src原因如下:关于 glob 分隔符的 gulpjs 文档 https://gulpjs.com/docs/en/getting-started/explaining-globs#segments-and-separators:

glob 中的分隔符始终是/字符 - 无论操作系统如何 - 即使在路径分隔符为的 Windows 中\\。在一个球体中,\\被保留作为转义字符。

避免使用 Node 的路径方法(例如 path.join)来创建 glob。在 Windows 上,它会生成无效的 glob,因为 Node 使用\\作为分隔符。出于同样的原因,还应避免使用 __dirname global、__filename global 或 process.cwd()。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Gulp 将多个文件解压到同一文件夹中 的相关文章

随机推荐

  • 加载微调器会在页面上的每个按钮上激活

    我正在尝试将加载旋转器集成到按钮中 这也非常有效 问题 如果我单击一个按钮 微调器将对每个其他按钮做出响应 我该如何纠正这个问题 My code
  • 如何在 C++ 数据结构中存储 Fortran 风格的长字符标量

    我正在使用需要字符标量的旧版 Fortran 库PATH作为子例程的参数 原来的界面是 SUBROUTINE MINIMAL VAR1 PATH CHARACTER LEN 4096 PATH 我需要能够从 C 调用它 因此我进行了以下更改
  • 出现 TypeError:无法 pickle _thread.lock 对象

    我正在查询 MongoDB 以获取字典列表 对于列表中的每个字典 我正在对值进行一些比较 根据比较结果 我将字典的值 比较结果和计算出的其他值存储在 mongoDB 集合中 我试图通过调用多处理来做到这一点 但收到此错误 def save
  • 在 Visual Studio 2019 中运行 python matplotlibcpp

    我想为 C 程序安装绘图功能 我选择了matplotlibcpp由于其简单性和在线评论 但是 我无法生成图并出现许多神秘错误 我是 C 新手 更新 VS 2019 的包含路径后 我能够在编译和链接时没有错误 但执行过程中列出了许多错误 下面
  • 在哪里可以找到 Azure Devops 中项目的 System.TeamProjectId

    我需要预先提供此 ID 但我似乎无法在网上找到它 The 文档 https learn microsoft com en us azure devops pipelines build variables view vsts仅将其称为系统变
  • 如何在php中根据时区获取Unix时间戳

    代码优先 echo time br echo date Y m d H i s br date default timezone set America New York echo time br print r timezones tim
  • Mongo 聚合的分页跳过和限制

    我正在使用flask paginate在flask Python框架 中进行分页 仅供参考 我能够实现分页find查询如下 from flask paginate import Pagination from flask paginate
  • 为什么我从 App Engine 调用 Google API 时会收到 invalid_grant?

    我正在尝试从 App Engine 访问 Google Prediction API 并按照此处的说明进行操作 https developers google com appengine articles prediction servic
  • 根据文本区域行调整 TD 高度

    我有一个文本区域rows 1 里面一个 td 因此空时占用的空间尽可能小 现在我想知道 当用户按下回车键时 如何最好地 扩展 文本区域 我提出了一个非常简单的jsfiddle http jsfiddle net zdjsU 来测试这个想法
  • com.sec.android.provider.* 应用程序到底是什么?

    我知道这不是代码问题 但是 我尝试处理存储在类似目录中的一些数据库 data data com sec android provider 提供商签名中的 sec 是什么意思 这取决于制造商吗 一个例子 内容提供商call logs读取数据库
  • 多个 after_commit 回调的执行顺序 (Rails)

    我最近发现有多个after commit在同一模型中定义的对象会以相反的顺序被调用 例如 after commit method1 on gt create after commit method2 on gt create method2
  • 使用整数键创建关联数组

    我需要在 javascript 中创建一个关联数组integer关键如下 a 10 ten 但是当我创建一个数组时 它将值放入10th数组的索引 它创建一个长度为 11 的数组 我希望它是一个键值对 我知道这可以通过使用对象来完成 但我只需
  • Django 与另一个字段的多对多关系

    我有两个模型 Recipe and Ingredient 配方模型与成分有多种关系 但我还需要能够指定成分的数量 我的模型目前看起来像 class Ingredient models Model name models CharField
  • 获取包含当前输入值的 HTML

    我需要获取整个页面的 HTML 其中包含所有输入的当前值value 我试过这个 document getElementById htmlId innerHTML 和这个 html html 但两者都返回 HTML 页面 但没有输入值 I k
  • Bash:在初始注释后将行插入源代码文件

    我需要使用 bash 在 python 文件中插入一行 该行需要出现在文件中的任何初始注释之后 所以给定文件 usr bin python This is just an example comment moo cow etc 我需要一个
  • 如何防止 C# 中表单的 keydown 事件多次触发?

    根据官方文档 http msdn microsoft com en us library ms171536 aspx Windows 窗体控件上的 KeyDown 事件仅发生一次 但很容易证明只要按住某个键 该事件就会不断触发 privat
  • 顶级域名中的号码?

    顶级域名末尾可以包含数字吗 我对 DNS 规则等一无所知 但是当我尝试将 PHP 的 filter var 函数与 FILTER VALIDATE EMAIL 一起使用时 email protected cdn cgi l email pr
  • 为什么我们不能在 if 语句中定义变量?

    也许这个问题以前已经回答过 但是这个词if经常出现 很难找到它 这个例子没有意义 表达式总是正确的 但它说明了我的问题 为什么此代码有效 StringBuilder sb if sb new StringBuilder test null
  • 使用 LINQ 从数据库查找附近的地点

    我们希望使用 ASP NET 2012 中的 LINQ 从数据库接收附近地点的列表 并希望获得有关我们策略的一些反馈 我的表格和假数据 PlaceId Name Latitude Longitude 1 A 18 1 20 1 2 B 18
  • 如何使用 Gulp 将多个文件解压到同一文件夹中

    我想解压缩单个文件夹内的多个 zip 文件 每个解压缩的文件都将被解压到与原始 zip 文件同名的文件夹中 并作为子文件夹添加到包含原始 zip 的原始文件夹中 像这样的东西 parent folder a zip b zip c zip