Почему этот скрипт gulp ведет себя по-разному между v4.0.0-alpha.2 и v4.0.2? - PullRequest
0 голосов
/ 06 июня 2019

Хотя этот скрипт использует 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\android и app\images\apple (по 2 в каждом)

Результат с gulp@4.0.0-alpha.2 (ожидаемый / желаемый):

  • .dev \ образы \ Android \ 1.png
  • .dev \ образы \ Android \ 2.png
  • .dev \ образы \ яблоко \ 1.png
  • .dev \ образы \ яблоко \ 2.png

Результат с gulp@v4.0.2 (неожиданно):

  • .dev \ изображения \ приложение \ изображения \ Android \ 1.png
  • .dev \ изображения \ приложение \ изображения \ Android \ 2.png
  • .dev \ изображения \ приложение \ изображения \ яблоко \ 1.png
  • .dev \ изображения \ приложение \ изображения \ яблоко \ 2.png

1 Ответ

2 голосов
/ 20 июля 2019

С разделители пути в глобах, документы gulpjs :

Сегменты и разделители

Сегмент - это все, что находится между разделителями. Разделитель в шарике есть всегда символ / - независимо от операционной системы - даже в Windows, где разделитель пути - \\. В глобусе \\ зарезервировано как escape-персонаж.

И из документов : пути Windows :

Пожалуйста, используйте только косые черты в выражениях глобуса.

Хотя в качестве разделителя пути Windows использует / или \, только / символы используются этой глобальной реализацией. Вы должны использовать косая черта только в глобальных выражениях. Обратная косая черта всегда будет интерпретируется как escape-символы, а не как разделители пути.

Так что ваш глоб ['app\\images\\**\\*.*' определенно является проблемой, так как он содержит escape-последовательности, а не обязательные / разделители пути.

В частности, glob (или gulp) не может определить base со всеми escape-последовательностями. Когда вы явно устанавливаете base, очевидно, это решает проблему.

Мне не понятно, почему ваш шар действительно что-то находит, возможно, из-за этого:

Если в экранированном шаблоне нет совпадений и установлен флаг 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. Конечно, как говорят в документах, в области глоба следует использовать только косые черты.

Это объясняет проблему с вашим кодом, но не то, почему, черт возьми, вы получили разные результаты в gulp@4.0.0-alpha.2, но не alpha.3 или 4.0.2 ???? Но я сильно подозреваю, что это связано с gulp alpha src . Он "работал" в alpha.2, но работа сама по себе была ошибкой, она не должна была работать, и эта ошибка (которая позволяла работать некорректному коду) была исправлена ​​позже.

...