簡體   English   中英

Gulp 4 `series` 不同步完成任務

[英]Gulp 4 `series` does not complete tasks synchronously

我有一堆目標/品牌應用程序,我正在為其創建構建例程。 基本概念是我調用類似gulp iosBuild --target app1東西,並且在編譯之前將調整/移動各種文件/文件夾。 我似乎有點愚蠢,因為編譯步驟在文件/文件夾調整位完成之前就開始了。 我在谷歌漏洞之后拼湊了以下內容。 有人能告訴我我做錯了什么嗎?


// fetch command line arguments
const arg = (argList => {
  let arg = {}, a, opt, thisOpt, curOpt;
  for (a = 0; a < argList.length; a++) {
    thisOpt = argList[a].trim();
    opt = thisOpt.replace(/^\-+/, '');
    if (opt === thisOpt) {
      // argument value
      if (curOpt) arg[curOpt] = opt;
      curOpt = null;
    } else {
      // argument name
      curOpt = opt;
      arg[curOpt] = true;
    }
  }
  return arg;
})(process.argv);

gulp.task('clean-ios', () => {
  return gulp.src(['App_Resources/iOS/*.xcassets', 'platforms/ios/build/*.*'], { read: false })
    .pipe(clean());
});

// various items that are specific to each branded app
const iosConfigs = [
  {
    name: 'app1',
    bundleName: 'Sample App',
    profile: 'xxxx-xxxx-xxxx',
    appcenterId: 'xxxx-xxxx-xxxx'
  },
  {
    name: 'app2',
    bundleName: 'Sample App2',
    profile: 'xxxx-xxxx-xxxx',
    appcenterId: 'xxxx-xxxx-xxxx'
  },
  {
    name: 'app3',
    bundleName: 'Sample App3',
    profile: 'xxxx-xxxx-xxxx',
    appcenterId: 'xxxx-xxxx-xxxx'
  }
];

// Google told me to do this
function build(done) {

  const setupTasks = iosConfigs.map(config => {
    log(arg);
    if (arg.target !== config.name) {
      log('no match'); // if called with --target app2, return no-ops for app1,app3, etc
      return (taskDone) => {
        taskDone();
      }
    } else
      return (taskDone) => {


        gulp
          .src('src/main.tns.template.ts')
          .pipe(replace('%appcenterid%', config.appcenterId))
          .pipe(rename('main.tns.ts'))
          .pipe(gulp.dest('src'));

        gulp
          .src('package.json')
          .pipe(replace(/(com\.acme\.)([^"]+)"/, '$1' + config.name + '"'))
          .pipe(gulp.dest('.'));

        gulp
          .src('src/app/core/config/app.config.tns.ts')
          .pipe(replace(/(https:\/\/)[^.]+(\.acme\.com)/, '$1' + config.name + '$2'))
          .pipe(gulp.dest('src/app/core/config'));

        gulp
          .src('targets/' + config.name + '/build.xcconfig')
          .pipe(gulp.dest('App_Resources/iOS'));

        gulp
          .src('targets/' + config.name + '/email_logo.png')
          .pipe(rename('brandicon.png'))
          .pipe(gulp.dest('App_Resources/iOS'));

        gulp
          .src('targets/' + config.name + '/*.scss')
          .pipe(gulp.dest('src/styles'));

        gulp
          .src('targets/' + config.name + '/Assets.xcassets/**/*.*', { base: 'targets/' + config.name })
          .pipe(gulp.dest('App_Resources/iOS'));

        taskDone();
      }
  });

  const buildTasks = iosConfigs.map(config => {
    log(arg);
    if (arg.target !== config.name) {
      log('no match');
      return (taskDone) => {
        taskDone();
      }
    } else {
      return (taskDone) => {
        log('running runner');
        run('tns build ios --release --for-device --env.production=true --bundle --env.aot --provision=' + config.profile).exec(config.name, () => {
          log('build done');
        });
        taskDone();
      }
    }
  });

// my expectation is that everything in 'setupTasks' will complete before 'buildTasks' is called... doesn't happen that way though
  return gulp.series('clean-ios', ...setupTasks, ...buildTasks, (seriesDone) => {
    seriesDone();
    done();
  })();
}

exports.iosBuild = build;

是的,無需等待所有異步設置任務完成。

return (taskDone) => {
  gulp
    .src('src/main.tns.template.ts')
    .pipe(...)

  gulp
    .src('package.json')
    .pipe(...);

  ...

  taskDone(); // will be executed before any of above streams
}

您可以嘗試重寫此邏輯以使用gulp.parallel可組合函數,例如:

return gulp.parallel(
    () => gulp
        .src('src/main.tns.template.ts')
        .pipe(...),
    () => gulp
        .src('package.json')
        .pipe(...),
    ...
)

這是完整的setupTasks代碼:

const setupTasks = iosConfigs.map(config => {
  log(arg);
  if (arg.target !== config.name) {
    log('no match'); // if called with --target app2, return no-ops for app1,app3, etc
    return (taskDone) => {
      taskDone();
    }
  } else
    return gulp.parallel(
      () => gulp
        .src('src/main.tns.template.ts')
        .pipe(replace('%appcenterid%', config.appcenterId))
        .pipe(rename('main.tns.ts'))
        .pipe(gulp.dest('src')),
      () => gulp
        .src('package.json')
        .pipe(replace(/(com\.acme\.)([^"]+)"/, '$1' + config.name + '"'))
        .pipe(gulp.dest('.')),
      () => gulp
        .src('src/app/core/config/app.config.tns.ts')
        .pipe(replace(/(https:\/\/)[^.]+(\.acme\.com)/, '$1' + config.name + '$2'))
        .pipe(gulp.dest('src/app/core/config')),
      () => gulp
        .src('targets/' + config.name + '/build.xcconfig')
        .pipe(gulp.dest('App_Resources/iOS')),
      () => gulp
        .src('targets/' + config.name + '/!*.scss')
        .pipe(gulp.dest('src/styles')),
      () => gulp
        .src('targets/' + config.name + '/Assets.xcassets/!**!/!*.*', {base: 'targets/' + config.name})
        .pipe(gulp.dest('App_Resources/iOS'))
    )
});

正如@yurzui 所提到的,問題是您的代碼沒有等待 setupTasks 中指定的所有 gulp 子任務完成並更早執行taskDone 將您的setupTasks函數更新為:

 const setupTasks = iosConfigs.map(config => { log(arg); if (arg.target !== config.name) { log('no match'); // if called with --target app2, return no-ops for app1,app3, etc return (taskDone) => { taskDone(); } } else { return (taskDone) => { const task1 = () => gulp .src('src/main.tns.template.ts') .pipe(replace('%appcenterid%', config.appcenterId)) .pipe(rename('main.tns.ts')) .pipe(gulp.dest('src')); const task2 = () => gulp .src('package.json') .pipe(replace(/(com\\.acme\\.)([^"]+)"/, '$1' + config.name + '"')) .pipe(gulp.dest('.')); const task3 = () => gulp .src('src/app/core/config/app.config.tns.ts') .pipe(replace(/(https:\\/\\/)[^.]+(\\.acme\\.com)/, '$1' + config.name + '$2')) .pipe(gulp.dest('src/app/core/config')); const task4 = () => gulp .src('targets/' + config.name + '/build.xcconfig') .pipe(gulp.dest('App_Resources/iOS')); const task5 = () => gulp .src('targets/' + config.name + '/email_logo.png') .pipe(rename('brandicon.png')) .pipe(gulp.dest('App_Resources/iOS')); const task6 = () => gulp .src('targets/' + config.name + '/*.scss') .pipe(gulp.dest('src/styles')); const task7 = () => gulp .src('targets/' + config.name + '/Assets.xcassets/**/*.*', { base: 'targets/' + config.name }) .pipe(gulp.dest('App_Resources/iOS')); return gulp.series( //gulp.parallel task1, task2, task3, task4, task5, task6, task7 )(taskDone); } } });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM