Npm 为什么这个gulp脚本在v4.0.0-alpha.2和v4.0.2之间的行为有所不同?

Npm 为什么这个gulp脚本在v4.0.0-alpha.2和v4.0.2之间的行为有所不同?,npm,gulp,gulp-4,Npm,Gulp,Gulp 4,虽然这个脚本使用的是Gulp4.0.0-alpha.2,但我怀疑这个脚本最初是为3.x编写的 我继承了一个吞咽脚本,其中包含以下任务: pump([ gulp.src(['app\\images\\**\\*.*']), gulp.dest('.dev\\images') ] , done); (传入.src和.dest的值最初是从其他地方检索的,但似乎没有任何代码对其进行修改) app\images文件夹包含包含多个文件的icons子文件夹,gulp脚本的结果是: 在4.0

虽然这个脚本使用的是Gulp4.0.0-alpha.2,但我怀疑这个脚本最初是为3.x编写的

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

pump([
    gulp.src(['app\\images\\**\\*.*']),
    gulp.dest('.dev\\images')
] , done);
(传入
.src
.dest
的值最初是从其他地方检索的,但似乎没有任何代码对其进行修改)

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

  • 4.0.0-alpha.2
    上,这些文件被放置在
    .dev\images\icons
  • 4.0.2
    上,这些文件在
    .dev\images\app\images\icons
两个完整路径现在似乎连接起来了,而以前只有来自全局的相对路径(即当
app\images\***.
found
app\images\icons\icon1.png
时返回
icons\icon1.png

调用时传入选项可解决此问题:

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\android
app\images\apple
下有文件(每个2个)

结果为
gulp@4.0.0-alpha.2(预期/预期):

  • .dev\images\android\1.png
  • .dev\images\android\2.png
  • .dev\images\apple\1.png
  • .dev\images\apple\2.png
结果为
gulp@v4.0.2
(非预期):

  • .dev\images\app\images\android\1.png
  • .dev\images\app\images\android\2.png
  • .dev\images\app\images\apple\1.png
  • .dev\images\app\images\apple\2.png
来自:

段和分隔符

分段是分隔符之间的所有内容。球体中的分隔符为 始终使用
/
字符-无论操作系统如何-即使在 路径分隔符为
\\
的窗口。在glob中,
\\
保留为 转义字符

从以下方面:

请仅在全局表达式中使用前斜杠。

尽管windows使用
/
\
作为其路径分隔符,但只有
/
此glob实现使用字符。你必须使用 仅在全局表达式中使用正斜杠。后面的斜杠永远都是 解释为转义字符,而不是路径分隔符

因此,您的glob
['app\\images\\***\*.'
肯定是个问题,因为它有转义序列,而不是所需的
/
路径分隔符

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

我不清楚为什么你的地球仪真的发现了什么,可能是因为:

如果转义模式没有匹配项,并且设置了nonull标志,那么glob将返回所提供的模式,而不是解释字符转义

From.
nonull
标志默认设置

您的原始代码在
本地版本4.0.0-alpha.3
中为我生成了“未预期”的结果,我不知道为什么它在
alpha.2
中的工作方式不同。考虑到转义问题,我会说“未预期”的结果是正确的结果,因为
base
要么无法确定,要么为空

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

return gulp.src(['app\\images/**\\*.*'])  // note the one forward slash
显然,这足以让
base
准确确定。当然,正如文档所说,glob部分只应使用前斜杠

这就解释了代码的问题,但不是为什么在
gulp@4.0.0-alpha.2
但不是
alpha.3
4.0.2
???但我强烈怀疑它与相关。它在
alpha.2
中“起作用”,但工作本身就是一个bug,它不应该起作用,而那个bug(允许不正确的代码工作)稍后修复。

来自:

段和分隔符

段是分隔符之间的所有内容。全局中的分隔符是 始终使用
/
字符-无论操作系统如何-即使在 路径分隔符为
\\
的窗口。在全局中,
\\
保留为 转义字符

从以下方面:

请仅在全局表达式中使用前斜杠。

尽管windows使用
/
\
作为其路径分隔符,但只有
/
此glob实现使用了字符。您必须使用 前斜杠仅在全局表达式中使用。后斜杠将始终使用 解释为转义字符,而不是路径分隔符

因此,您的glob
['app\\images\\***\*.'
肯定是个问题,因为它有转义序列,而不是所需的
/
路径分隔符

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

我不清楚为什么你的地球仪真的发现了什么,可能是因为:

如果转义模式没有匹配项,并且设置了nonull标志,那么glob将按照提供的方式返回模式,而不是进行解释