在 gulp.rename() 调用中使用之前 gulp.src 的文件名

Use filename from earlier gulp.src in gulp.rename() call

我在文件夹中有一个 zip 文件,我想提取其中一个(压缩的)文件并在文件夹 ./sourcefiles_unpacked/

中为其指定一个文件名模式 source file basename + .xml
./sourcefiles/test.zip

=>

./sourcefiles/test.zip
./sourcefiles_unpacked/test.xml

使用 gulp-unzip 可以很好地解压缩和过滤,但是我不确定如何从 gulp.src 调用中访问文件名。

gulp.task('unzip-filtered-rename', function() {
  return gulp.src(paths.unzip_sourcefiles)
    // .pipe(debug())
    .pipe(plumber({
      errorHandler: notify.onError('unzip-filtered-rename error: <%= error.message %>')
    }))
    .pipe(changed(paths.excel_targetdir_local_glob, {
      extension: '.xml'
    }))
    .pipe(unzip({filter : function(entry){return minimatch(entry.path, "contents.xml")}}))
    .pipe(gulp.rename(function(path){       

        // ? What do I put here to rename each target file to 
        // ?   its originating zip file's basename?


    })) //   "==> test.xml",
    .pipe(gulp.dest(paths.sourcefiles_unpacked)) //   sourcefiles_unpacked: "./sourcefiles_unpacked/"
});

一旦 gulp.rename() 被调用,块就被重命名为它在 zip 文件中的名称。

试试这个:

const glob = require("glob");
const zipFiles = glob.sync('sourcefiles/*.zip');

gulp.task('unzip-filtered-rename', function (done) {

  zipFiles.forEach(function (zipFile) {

    const zipFileBase = path.parse(zipFile).name;

    return gulp.src(zipFile)
        // .pipe(debug())
        //   .pipe(plumber({
        //     errorHandler: notify.onError('unzip-filtered-rename error: <%= error.message %>')
        //   }))
        //   .pipe(changed(paths.excel_targetdir_local_glob, {
        //     extension: '.xml'
        //   }))
        //   .pipe(unzip({filter : function(entry){return minimatch(entry.path, "contents.xml")}}))
        .pipe(rename({
            basename: zipFileBase,
        }))
        .pipe(gulp.dest("./sourcefiles_unpacked")) //   sourcefiles_unpacked: "./sourcefiles_unpacked/"
    });
    done();
});

我注释掉了您出于测试目的所做的其他事情。 运行 通过 forEach 或映射的每个文件允许您在流外部的开头设置一个变量,该变量将在以下流中可用。

有关设置要在流中使用的变量的更多讨论,另请参阅