尽管此脚本使用的是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
中调速现在看来,这两个完整路径已串联在一起,而以前只有来自全局的相对路径(即app\images\**\*.*
找到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(在写入目标位置时仅使用全局名称或文件名)来获得相同的行为?
最低复制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
(预期/期望):
结果为gulp@v4.0.2
(出乎意料):
答案 0 :(得分:2)
来自path separators in globs, gulpjs docs:
段和分隔符
段是分隔符之间的所有内容。一团中的分隔符是 始终使用
/
字符-与操作系统无关-甚至在 路径分隔符为\\
的Windows。在全局范围内,\\
被保留为 转义字符。
请仅在全局表达式中使用正斜杠。
尽管Windows使用
/
或\
作为其路径分隔符,但只有/
此glob实现使用字符。您必须使用 仅在全局表达式中使用正斜杠。反斜杠将始终为 解释为转义符,而不是路径分隔符。
因此,您的全局['app\\images\\**\\*.*'
绝对是一个问题,因为它具有转义序列,而不是必需的/
路径分隔符。
尤其是,glob(或gulp)无法找出其中包含所有转义序列的base
。当您显式设置base
显然可以解决此问题时。
我不清楚您的glob为什么实际上找到了任何东西,也许是因为这个原因:
如果转义的模式没有匹配项,并且设置了nonull标志,那么glob将按提供的方式返回模式,而不是解释字符转义。
来自glob docs。 nonull
标志是默认设置的。
您的原始代码在Local version 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
中得到不同的结果吗????但是我强烈怀疑它与gulp alpha src issues有关。它在alpha.2
中“有效”,但是“有效”本身就是一个错误,不应该有效,并且该错误(允许不正确的代码起作用)随后已修复。