我在一个文件夹中有一个zip文件,我想解压缩其中的一个文件(压缩文件),并在文件夹'./sourcefiles_unpacked/'中给它一个文件名模式'源文件基本名'+'.xml'。
./sourcefiles/test.zip
=>
./sourcefiles/test.zip
./sourcefiles_unpacked/test.xml
解压缩和过滤与gulp-unzip很好地兼容,但是:我不确定如何从两个管道访问文件名。
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()一经调用,该块便已重命名为其名称,如zipfile中一样。
尝试一下:
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或map运行每个文件,使您可以在流之外的开头设置变量,该变量将在以下流中可用。
另请参见How to unzip multiple files in the same folder with Gulp,以获取有关设置要在流中使用的变量的更多讨论。