Npm 为什么这个gulp脚本在v4.0.0-alpha.2和v4.0.2之间的行为有所不同?
虽然这个脚本使用的是Gulp4.0.0-alpha.2,但我怀疑这个脚本最初是为3.x编写的 我继承了一个吞咽脚本,其中包含以下任务: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
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\***.
foundapp\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将按照提供的方式返回模式,而不是进行解释