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

标签 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 仍在将转译后的文件放入原始位置,覆盖原始文件。我传递的 dest 有一些 Gulp 不喜欢的东西,并且默默地忽略了。

编辑 2

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

谁能对此提供一些见解?

编辑 3

根据斯文的回答,我试过了

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());

但似乎 base 被忽略了,我当前目录中的文件被抓取并就地转译(我最不想做的事 - 幸运的是 GIT 有助于消除损害)。

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

最佳答案

在 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() 才能使您的示例正常工作。


注意

您仍然需要在 src 路径中包含 '../application-base/'base 的目的是根据我上面的等式操纵目标路径;它不会用于减少您在 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() 设置了默认值:

Default: everything before a glob starts (see glob2base)

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

关于javascript - gulp.dest 没有创建目标文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36631746/

相关文章:

gulp - 尝试使用 gulp 使 browsersync 在 vagrant 中工作

javascript - 我如何通过这个算法挑战?

javascript - 更改::before 伪类中的 'content' 属性

javascript - 如何结合 jquery 响应与 php

javascript - 巴别塔配置 "strict mode"

javascript - gulp JavaScript 变量中 OR 的语法

JavaScript:鼠标坐标不正确(全屏模式下的 pageX 和 pageY)

javascript - 单击按钮/链接时如何添加特定的突出显示动画?

javascript - 应用程序 : Creating separate files for angularjs controllers, 服务等的基础

sass - sass-lint 是否忽略某一行?