为什么这个 gulp 脚本在 v4.0.0-alpha.2 和 v4.0.2 之间表现不同?

Why is this gulp script behaving differently between v4.0.0-alpha.2 and v4.0.2?

虽然此脚本使用 gulp 4.0.0-alpha.2,但我怀疑该脚本最初是为 3.x 编写的。

我继承了一个 gulp 脚本,其中包含以下任务:

pump([
    gulp.src(['app\images\**\*.*']),
    gulp.dest('.dev\images')
] , done);

(传递给 .src.dest 的值最初是从其他地方检索的,但似乎没有任何修改它们的代码)

app\images文件夹包含一个包含多个文件的icons子文件夹,gulp脚本的结果是:

这两个完整路径似乎现在连接起来了,而以前只有来自 glob 的相对路径(即当 app\images\**\*.* 找到 app\images\icons\icon1.png 时它返回 icons\icon1.png)。

传递 base into the options when calling src 似乎可以解决此问题:

pump([
    gulp.src(['app\images\**\*.*'], { base: 'app\images\' }),
    gulp.dest('.dev\images\')
] , done);

这不能解决传递具有不同基本路径的路径数组的情况,例如:

['app\styles\brand\**\*.*', 'app\brands\icons\icons.data.svg.css']

似乎还有一个更通用的解决方案可用,不需要我更新 src 的每个调用,所以....

如何使用 Gulp 4.0 获得相同的行为,在写入目标时仅使用 glob 或文件名?


最小重现 gulpfile.js:

'use strict';
const gulp = require('gulp');

exports.build = function()
{
    return gulp.src(['app\images\**\*.*'])
        .pipe(gulp.dest('.dev\images'));
}

package.json

{
  "name": "test-web",
  "version": "1.0.0",
  "description": "Test Project",
  "main": "gulpfile.js",
  "scripts": {
    "build": "gulp build"
  },
  "author": "Me",
  "license": "ISC",
  "devDependencies": {
    "gulp": "^4.0.2"
  }
}

app\images\androidapp\images\apple下有文件(各2个)

结果 gulp@4.0.0-alpha.2 (expected/desired):

gulp@v4.0.2 的结果(意外):

来自 path separators in globs, gulpjs docs:

Segments and separators

A segment is everything between separators. The separator in a glob is always the / character - regardless of the operating system - even in Windows where the path separator is \. In a glob, \ is reserved as the escape character.

并且来自 glob docs: Windows paths

Please only use forward-slashes in glob expressions.

Though windows uses either / or \ as its path separator, only / characters are used by this glob implementation. You must use forward-slashes only in glob expressions. Back-slashes will always be interpreted as escape characters, not path separators.

所以你的 glob ['app\images\**\*.*' 绝对是个问题,因为它有转义序列而不是所需的 / 路径分隔符。

特别是 glob(或 gulp)无法计算出其中包含所有转义序列的 base。当您明确设置 base 时,显然可以解决问题。

我不清楚为什么你的 glob 实际上找到了任何东西,也许是因为这个:

If an escaped pattern has no matches, and the nonull flag is set, then glob returns the pattern as-provided, rather than interpreting the character escapes.

来自 glob docs。默认设置 nonull 标志。

您的原始代码在 Local version 4.0.0-alpha.3 中为我生成了 "un-expected" 结果,我不知道为什么它在 alpha.2 中的工作方式不同。鉴于转义问题,我会说 "un-expected" 结果是正确的结果,因为 base 无法确定或为空。

有趣的是,这个问题可以通过简单地使用这个来解决:

return gulp.src(['app\images/**\*.*'])  // note the one forward slash

显然这足以让 base 被准确地确定。当然,正如文档所说,在 glob 部分中只能使用正斜杠。

所以这解释了你的代码的问题,但不是为什么你在 gulp@4.0.0-alpha.2 而不是 alpha.34.0.2 中得到不同的结果????但我强烈怀疑它与gulp alpha src issues有关。它在 alpha.2 中 "worked" 但工作本身就是一个错误,它不应该工作并且该错误(允许不正确的代码工作)稍后被修复。