为什么这个 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脚本的结果是:
- 在
4.0.0-alpha.2
,这些文件被放置在 .dev\images\icons
- 在
4.0.2
,这些文件在 .dev\images\app\images\icons
这两个完整路径似乎现在连接起来了,而以前只有来自 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\android
和app\images\apple
下有文件(各2个)
结果 gulp@4.0.0-alpha.2
(expected/desired):
- .dev\images\android.png
- .dev\images\android.png
- .dev\images\apple.png
- .dev\images\apple.png
gulp@v4.0.2
的结果(意外):
- .dev\images\app\images\android.png
- .dev\images\app\images\android.png
- .dev\images\app\images\apple.png
- .dev\images\app\images\apple.png
来自 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.3
或 4.0.2
中得到不同的结果????但我强烈怀疑它与gulp alpha src issues有关。它在 alpha.2
中 "worked" 但工作本身就是一个错误,它不应该工作并且该错误(允许不正确的代码工作)稍后被修复。
虽然此脚本使用 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脚本的结果是:
- 在
4.0.0-alpha.2
,这些文件被放置在.dev\images\icons
- 在
4.0.2
,这些文件在.dev\images\app\images\icons
这两个完整路径似乎现在连接起来了,而以前只有来自 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\android
和app\images\apple
下有文件(各2个)
结果 gulp@4.0.0-alpha.2
(expected/desired):
- .dev\images\android.png
- .dev\images\android.png
- .dev\images\apple.png
- .dev\images\apple.png
gulp@v4.0.2
的结果(意外):
- .dev\images\app\images\android.png
- .dev\images\app\images\android.png
- .dev\images\app\images\apple.png
- .dev\images\app\images\apple.png
来自 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.3
或 4.0.2
中得到不同的结果????但我强烈怀疑它与gulp alpha src issues有关。它在 alpha.2
中 "worked" 但工作本身就是一个错误,它不应该工作并且该错误(允许不正确的代码工作)稍后被修复。