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

时间:2019-06-06 12:40:25

标签: npm gulp gulp-4

尽管此脚本使用的是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)。

调用base时将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(在写入目标位置时仅使用全局名称或文件名)来获得相同的行为?


最低复制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(预期/期望):

  • .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

1 个答案:

答案 0 :(得分:2)

来自path separators in globs, gulpjs docs

  

段和分隔符

     

段是分隔符之间的所有内容。一团中的分隔符是   始终使用/字符-与操作系统无关-甚至在   路径分隔符为\\的Windows。在全局范围内,\\被保留为   转义字符。

并从glob docs: Windows paths

  

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

     

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

因此,您的全局['app\\images\\**\\*.*'绝对是一个问题,因为它具有转义序列,而不是必需的/路径分隔符。

尤其是,glob(或gulp)无法找出其中包含所有转义序列的base。当您显式设置base显然可以解决此问题时。

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

  

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

来自glob docsnonull标志是默认设置的。

您的原始代码在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.34.0.2中得到不同的结果吗????但是我强烈怀疑它与gulp alpha src issues有关。它在alpha.2中“有效”,但是“有效”本身就是一个错误,不应该有效,并且该错误(允许不正确的代码起作用)随后已修复。