【问题标题】:gulp notification happens before task is completegulp 通知在任务完成之前发生
【发布时间】:2016-04-08 09:28:12
【问题描述】:

无法理解 gulp(我是新手)。

我想自动化一个产品构建,其中涉及从 gitlab 存储库克隆。

我不明白为什么我需要src('package.json'),这是某种诡计吗?我也不明白为什么我会在任务开始而不是结束时收到通知!

var gulp   = require('gulp');
var git    = require('gulp-git-streamed');
var notify = require('gulp-notify');


gulp.task('clone', function() {
  return gulp
    .src('package.json') // wth is this?
    .pipe(git.clone('https://gitlab.somedomain.com/mockups/theme.git', {args: './src/gitlab/mockups'}))
    .pipe(notify('psd repo cloned!')); // why does this run before cloning is finished?
});

会发生什么:

[13:16:34] gulp-notify: [Gulp notification] psd repo cloned!
[13:20:23]  Cloning into './src/gitlab/mockups'...
Checking out files: 100% (18/18), done.

有什么想法吗?

【问题讨论】:

    标签: javascript node.js gulp gulp-git


    【解决方案1】:

    gulp-git-streamedgulp-git 的包装器,它允许您将 git 操作应用于流中的文件。这对于添加和提交文件之类的事情很有意义:

    return gulp.src('**/*.js')
      .pipe(git.add())
      .pipe(git.commit('Commit all JS files'))
    

    但是,clone 操作毫无意义。 gulp-git-streamed 实际上并没有将克隆的文件发送到流中,因为它需要一个现有的流开始,你必须人为地创建一个你知道存在的虚拟文件,如 package.json

    在您的情况下,最好直接使用gulp-gitnode-notifier

    var gulp   = require('gulp');
    var git    = require('gulp-git');
    var notifier = require('node-notifier');
    
    gulp.task('clone', function(done) {
      git.clone('https://gitlab.somedomain.com/mockups/theme.git',
        {args: './src/gitlab/mockups'}, function (err) {
          if (err) {
            notifier.notify(err.message);      
          } else {
            notifier.notify('psd repo cloned!');
          }
          done();
      });
    });
    
    gulp.task('dependsOnClone', ['clone'], function(done) {
      console.log('starts executing after clone task has finished');
    });
    

    【讨论】:

    • 是的,我试过了,这种方法的问题是我不能再链接克隆任务了。
    • 表示依赖于克隆的任务在克隆之前运行...使用包装器至少可以避免这种情况。
    • 您可能忘记在您的实现中使用done() 回调。试试我的。依赖于clone 任务的任务只有在clone 任务完成后才会启动。
    • 是的,我没有做()!你能用几句话告诉我这里做了什么吗?
    • git.clone() 是异步的。这意味着它会立即返回,但克隆存储库的实际工作尚未完成。必须有一些东西告诉 gulp 克隆操作已经完成。否则 gulp 只会假设 clone 任务已经完成并开始运行下一个任务。那个“东西”是done() 回调。只有在它被调用之后,gulp 才会认为 clone 任务已经完成并开始执行下一个任务。
    猜你喜欢
    • 2016-12-22
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    相关资源
    最近更新 更多