Я пытаюсь передать значение из одной задачи в другую из обратного вызова с gulp 4, но у меня ошибка - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь создать git deploy с gulp 4. Но gulp 4 выдает ошибку и рекомендует использовать gulp series. Как я могу использовать gulp.series, если мне нужно получить значение из ответа функции?

Например, я использую плагин gulp-verify. Чтобы пользователь мог ввести текст коммита. Вы можете увидеть это в .pipe (подтвердите ({... эта функция возвращает "answer" в свойстве "continue". Этот ответ должен быть в ".pipe (git.commit (answer))", как я могу это сделать, ребята Я не лучший в ES6 ...

// развернуть систему

gulp.task('set-prod-env', function (done) {
  process.env.NODE_ENV = 'production';
  done();
});


function gitCommit() {
  return new Promise(function(resolve, reject) {
    gulp.src('config.rb')
      .pipe(confirm({
        // Static text.
        question: 'Pls write commit text',
        proceed: function(answer) {
          return gulp.src(' ')
            .pipe(git.add({args: '--all'}))
            .pipe(git.commit(answer));
        }
      }))
      .pipe(gulp.dest('./'));
      resolve();
  })
}

function gitPush(done) {
  git.push('origin', 'dev', function (err) {
    if (err) throw err;
  });
  done();
}

gulp.task('deploy', gulp.series('set-prod-env', 'build', gitCommit, gitPush));

Теперь код работает, но с ошибкой, может быть, кто-то может показать лучший пример, с Gulp 4, gulp 4 отличается от gulp 3.

1 Ответ

0 голосов
/ 12 января 2019

Есть несколько проблем с кодом:

  1. Вы передаете один файл в confirm и хотите запросить текст
  2. Существует несколько проблем с обработкой асинхронных возвратов / обратных вызовов
  3. То, что вы хотите сделать, не совсем то, что вы вставили в код

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

Быстрое и грязное решение этой проблемы может заключаться в использовании readline-sync , поскольку вы хотите дождаться завершения коммита в любом случае.

Следующий код должен быть больше в направлении, куда вы хотите идти. Хотя это не проверено, так как я не хотел создавать новый репозиторий для проверки этого ...:)

Я добавил несколько комментариев, чтобы показать намерение и где я что-то изменил, где я увидел проблемы с оригинальным кодом. Надеюсь, это поможет!

// import `readlineSync` to simplify the command line prompt
// I've never used it myself, there might be better ways to do this!
const readlineSync = require('readline-sync');

gulp.task('set-prod-env', function (done) {
  process.env.NODE_ENV = 'production';
  done();
  // Actually, you wouldn't need to have `done` as parameter and call it, as this function is synchronous. As soon as the function is at the end, it's done (if it did not return a promise, stream or wants to call the `done` callback.
});

// Using a single file to create a stream to use some prompt about a stream
// is a very hacky way to do this and I wouldn't try to do that. To make
// this simpler, I've changed it to synchronously wait for an answer here
// before starting / returning the pipeline
function gitCommit() {
  // this should block gulp completely until you answered the question
  const commitMessage = readlineSync.question('Please write your commit message');
  // this returns the actual action of `gitCommit`
  return gulp.src('.')
    .pipe(git.add({args: '--all'}))
    .pipe(git.commit(commitMessage));
}

// this function returned before `git.push` is really done.
// It might not cause issues as "push" is the last action in your pipeline,
// but you might run into issues if you want to do something AFTER `gitPush`.
function gitPush(done) {
  git.push('origin', 'dev', function (err) {
    if (err) return done(err); // this will send the error to the caller (gulp), if there was one
    done(); // this should be called when `git.push` is done - i.e. inside of its callback
  });
  // you could simplify this to:
  // git.push('origin', 'dev', done);
}

gulp.task('deploy', gulp.series('set-prod-env', 'build', gitCommit, gitPush));
...