Gulp.series с тем же исходным файлом не работает (асинхронные задачи не ожидались) - PullRequest
0 голосов
/ 18 октября 2019

У меня есть несколько задач gulp, которые используют plop.js для изменения определенного файла. Если я запускаю задачи самостоятельно, они работают просто отлично.

Теперь у меня есть программа-оболочка, в которой я запрашиваю пользователя, какую из задач он хочет выполнить, и затем я хотел бы использовать gulp.series().

Все они работают, но для тех задач, для которых требуется изменить один и тот же исходный файл, будет применяться только первая модификация. Кажется, что задачи на самом деле не выполняются последовательно, что позволяет завершить первое изменение, а затем перейти ко второму ...

Вот код:

const gulp = require('gulp')

const strings = {
  polyfill: `polyfill-string-which-is-added-to-file`, // I simplified this one
  modernizr: `{ src: '/js/modernizr-custom.js', async: true, defer: true }`
}

/*
 * Replace specific comments with a string
 * Using plop modify actions
 */
function replaceComment(path, template, pattern) {
  console.log(`? Replacing ${pattern} in ${path}...`)

  const nodePlop = require('node-plop')
  const plop = nodePlop()

  const generator = plop.setGenerator('replace', {
    prompts: [],
    actions: [
      {
        type: 'modify',
        path,
        pattern,
        template
      }
    ]
  })

  generator
    .runActions()
    .then(results => {
      console.log(`?✅ Sucessfully modified ${path} with ${template}`)
    })
    .catch(err => {
      console.log('err', err)
    })
}

gulp.task('add-polyfill', function(done) {
  console.log('Adding IE11 polyfill to nuxt.config.js ...')

  const path = './nuxt.config.js'
  const pattern = '\/\*\ setup-autocomment-polyfill\ \*\/' // eslint-disable-line
  const template = strings.polyfill

  replaceComment(path, template, pattern)
  done()
})

gulp.task('add-modernizr', function(done) {
  console.log('Adding modernizr script to nuxt.config.js ...')

  const path = './nuxt.config.js'
  const pattern = '\/\*\ setup-autocomment-modernizr\ \*\/' // eslint-disable-line
  const template = strings.modernizr

  replaceComment(path, template, pattern)
  done()
})

gulp.task('setup', function(done) {
   return gulp.series('add-modernizr' , 'add-polyfill')(done)
})

Iбыл бы очень рад, если бы кто-то мог дать мне указатель здесь. Должен ли я больше работать с обещаниями? Или почему gulp.series на самом деле не делают этого в серии - я имею в виду задачи на их собственной работе ...

Приветствия и Заранее спасибо

1 Ответ

0 голосов
/ 18 октября 2019

Хорошо, я выяснил, в чем проблема. На самом деле это была вещь с обещаниями. Функция replaceComment() была запущена, но done() была вызвана до завершения replaceComment(). Поэтому мне пришлось ждать replaceComment(), где я возвращаю обещание, которое разрешается только после завершения модификации:

function replaceComment(path, template, pattern) {
  return new Promise((resolve, reject) => {

    console.log(`? Replacing ${pattern} in ${path}...`)

    const nodePlop = require('node-plop')
    const plop = nodePlop()

    const generator = plop.setGenerator('replace', {
      prompts: [],
      actions: [
        {
          type: 'modify',
          path,
          pattern,
          template
        }
      ]
    })

    generator
      .runActions()
      .then(results => {
        console.log(`?✅ Sucessfully modified ${path} with ${template}`)
        resolve()
      })
      .catch(err => {
        console.log('err', err)
        reject(err)
      })
  })
}


И затем для каждой задачи я добавляю асинхронное ожидание:

gulp.task('add-polyfill', async function(done) {
  console.log('Adding IE11 polyfill to nuxt.config.js ...')

  const path = './nuxt.config.js'
  const pattern = '\/\*\ setup-autocomment-polyfill\ \*\/' // eslint-disable-line
  const template = strings.polyfill

  await replaceComment(path, template, pattern)
  done()
})

Приветствия

...