gulp.dest没有创建目标文件夹

时间:2016-04-14 19:00:12

标签: javascript gulp

我的gulp代码看起来像这样,部分

gulp.src(['../application-base/**/**.js', '!../application-base/assets/**/**.js'], { base: './' })
    .pipe(gulpPlumber({
        errorHandler: function (error) {
            console.log(`\nError ${error}`);
            this.emit('end');
        }
    }))
    .pipe(gprint(filePath => "Transpiling: " + filePath.replace('..\\application-base\\', '')))
    .pipe(babel({ compact: false }))
    .pipe(gulp.dest('../application-base-transpiled/'))
    .on('end', () => done());

如果我改变

.pipe(gulp.dest('../application-base-transpiled/'))

.pipe(gulp.dest(''))

然后创建转换后的文件,并覆盖原件。问题是

.pipe(gulp.dest('../application-base-transpiled/'))

不会在application-base-transpiled

下使用相同的原始路径保存文件

正如你所看到的,我正在使用一个基础,这似乎不起作用。

我错过了什么?

修改

我仔细观察,甚至用

.pipe(gulp.dest('../application-base-transpiled/'))

Gulp仍然将已编译的文件放入原始位置,覆盖原始文件。有一些关于我正在传递的目标,Gulp不喜欢,并默默无视。

编辑2

似乎删除 base选项解决了这个问题,这与我在别处看到的建议相反。 gulp.dest的文档并没有真正讨论这个问题。

任何人都可以对此提供一些见解吗?

编辑3

Per Sven的回答,我试过这个

gulp.src(['**/**.js', '!assets/**/**.js'], { base: '../application-base' })
    .pipe(gulpPlumber({
        errorHandler: function errorHandler(error) {
            console.log('\nError ' + error);
            this.emit('end');
        }
    }))
    .pipe(gprint(filePath => "Transpiling: " + filePath.replace('..\\application-base\\', '')))
    .pipe(babel({ compact: false }))
    .pipe(gulp.dest('../application-base-transpiled/'))
    .on('end', () => done());

但似乎基础被忽略了,我当前目录中的文件被抓取并转换到位(我想要的最后一件事 - 幸运的是GIT有助于消除损坏)。

使用src数组时是否忽略了基本参数?

1 个答案:

答案 0 :(得分:6)

在gulp流中,文件的目标路径遵循以下伪方程:

gulp.dest +(gulp.src没有前导base)=文件的目标路径

示例:

gulp.src('src/js/foo.js', {base:'src/'}).pipe(gulp.dest('dist/'));

结果:

'dist/' +('src/js/foo.js'没有领先'src/')= 'dist/js/foo.js'

在你的情况下:

'../application-base-transpiled/' +('../application-base/foo/bar.js'没有领先'./')= '../application-base-transpiled/../application-base/foo/bar.js'

因此,您的文件最终会出现在原始目录中。

您必须将{base: '../application-base/'}传递给gulp.src()才能使您的示例正常运作。

注意

您仍然需要在'../application-base/'路径中加入srcbase的目的是按照上面的等式来操纵dest路径;它 not 的目的是减少您在gulp.src中键入的击键次数。所以最终的结果应该是这样的

gulp.src(['../application-base/**/**.js'], { base: '../application-base' })
        .pipe(gulpPlumber({
            errorHandler: function errorHandler(error) {
                console.log('\nError ' + error);
                this.emit('end');
            }
        }))
        .pipe(gprint(filePath => "Transpiling: " + filePath.replace('..\\application-base\\', '')))
        .pipe(babel({ compact: false }))
        .pipe(gulp.dest('../application-base-transpiled'))
        .on('end', () => done());

如果您未将base option传递给gulp.src(),则会设置默认值:

  

默认值:在glob开始之前的所有内容(请参阅glob2base

这意味着您传递给**的模式中的第一个*gulp.src()的所有内容都将用作base选项。由于您的模式为../application-base/**/**.js,因此base选项会自动变为../application-base/