0

虽然此脚本使用 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时传入选项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(预期/期望):

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

1 回答 1

2

glob 中的路径分隔符,gulpjs 文档

段和分隔符

段是分隔符之间的一切。glob 中的分隔符始终是/字符(无论操作系统如何),即使在路径分隔符所在的 Windows 中也是如此\\。在 glob 中,\\保留为转义字符。

并且来自glob 文档:Windows 路径

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

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

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

特别是,glob(或 gulp)无法找出其中的base所有转义序列。当您明确设置时,base显然可以解决问题。

我不清楚为什么你的 glob 真的找到了任何东西,也许是因为这个:

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

来自glob 文档。该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.34.0.2???? 但我强烈怀疑它与gulp alpha src 问题有关。它“工作”了,alpha.2但工作本身就是一个错误,它不应该工作,并且该错误(允许不正确的代码工作)后来被修复。

于 2019-07-20T04:13:12.820 回答