如何将gulp.dest()设置在与管道输入相同的目录中?

如何将gulp.dest()设置在与管道输入相同的目录中?,gulp,Gulp,我需要在每个目录中找到的所有图像进行优化并记录到它们中,而无需分别设置每个文件夹的路径。我不知道该怎么做 var gulp = require('gulp'); var imageminJpegtran = require('imagemin-jpegtran'); gulp.task('optimizeJpg', function () { return gulp.src('./images/**/**/*.jpg') .pipe(imageminJpegtran({ progre

我需要在每个目录中找到的所有图像进行优化并记录到它们中,而无需分别设置每个文件夹的路径。我不知道该怎么做

var gulp = require('gulp');
var imageminJpegtran = require('imagemin-jpegtran');

gulp.task('optimizeJpg', function () {

return gulp.src('./images/**/**/*.jpg')
    .pipe(imageminJpegtran({ progressive: true })())
    .pipe(gulp.dest('./'));
});
给你:

gulp.task('optimizeJpg', function () {

    return gulp.src('./images/**/**/*.jpg')
        .pipe(imageminJpegtran({ progressive: true })())
        .pipe(gulp.dest('./images/'));
});
Gulp将通配符或globstar的所有内容都放入其虚拟文件名中。因此,您知道要选择的所有部分(如
/images/
)都必须位于目标目录中。

以下是两个答案。
首先:它更长,灵活性更低,需要额外的模块,但它的工作速度要快20%,并为每个文件夹提供日志

var merge = require('merge-stream');

var folders =
[
    "./pictures/news/",
    "./pictures/product/original/",
    "./pictures/product/big/",
    "./pictures/product/middle/",
    "./pictures/product/xsmall/",
    ...
];

gulp.task('optimizeImgs', function () {

    var tasks = folders.map(function (element) {

        return gulp.src(element + '*')
            .pipe(sometingToDo())
            .pipe(gulp.dest(element));

    });

    return merge(tasks);

});
第二种解决方案:它灵活优雅,但速度较慢。我更喜欢

return gulp.src('./pictures/**/*')
    .pipe(somethingToDo())
    .pipe(gulp.dest(function (file) {
        return file.base;
    }));

您可以使用
base
参数:

gulp.task('uglify', function () {
  return gulp.src('./dist/**/*.js', { base: "." })
    .pipe(uglify())
    .pipe(gulp.dest('./'));
});

原始代码段中唯一问题的可能重复是使用
'./'
调用
dest
,而不是基
./images'
。修复该错误将在不更改方法的情况下使此工作正常。解决方案2是否可以改进为在未知文件夹深度下工作?我想遍历整个文件夹结构?@Rouz它已经可以在未知文件夹深度下工作
foo/***
表示foo及其任何级别的子目录中的所有文件。两颗双星是多余的。我已经找了很久了!我不能接受你不能将文件输出到它们所在的位置!非常感谢。我只是想补充一点,解决方案2在使用
tsconfig.json
文件指定输入/输出(对于在这种情况下登陆此处的用户)时非常有效。首先,确保注释掉(或删除)outDir。其次,如果您使用的是babel(gulpfile.babel.js),您可以使它更加优雅:
gulp.dest(file=>file.base)
。谢谢你的回答!为什么是两个双星?@turibe,双星就是我们提到的通配符ddbrrt@MarioAlbertoContreras一双就够了。“/images/***.jpg”与“/images/***/***.jpg”一样好