Как запустить две задачи grunt watch одновременно


можно ли одновременно запускать две задачи наблюдения?

Я понимаю, что у меня может быть любое количество задач, которые я хочу внутри посмотреть настройки и просто запустите хрюкать смотреть и он будет смотреть их всех, вот так

...
watch: {
    A: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee", "requirejs"]
    },
    B: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee"]
    },
    C: {
        files: "js/dev/**/*.html",
        tasks: ["copy"]
    }
}
...

...но мне это не нужно. Я просто хочу иметь другой набор задач для разработки и производства. Как вы можете догадаться, разница только между A (производства) и B (разработка) - это минификация и конкатенация. Мне не нужно запускать A и B задачи в то же время.

сначала я пришел с этой идеей

grunt.registerTask("prod", ["watch:A", "watch:C"]);
grunt.registerTask("dev", ["watch:B", "watch:C"]);

но это не сработало. Просто первые задачи вахты работает (C никогда не работает). Можно ли сделать то, что я хочу?

8 57

8 ответов:

Я нашел с помощью грунт-одновременных работает:

concurrent: {
  options: {
    logConcurrentOutput: true
  },
  prod: {
    tasks: ["watch:A", "watch:C"]
  },
  dev: {
    tasks: ["watch:B", "watch:C"]
  }
}

затем:

grunt.registerTask("prod", ["concurrent:prod"]);
grunt.registerTask("dev", ["concurrent:dev"]);

EDIT: concurrent теперь имеет ! Более подробная информация здесь:https://github.com/sindresorhus/grunt-concurrent#logconcurrentoutput.

Watch-это странно параллельная, но блокирующая задача, поэтому вам нужно быть творческим, чтобы работать с многозадачной функциональностью.

Concurrent теряет все выходные данные из задач watch, что не идеально.

попробуйте динамически написать объект конфигурации в пользовательской задаче:

grunt.registerTask('watch:test', function() {
  // Configuration for watch:test tasks.
  var config = {
    options: {
      interrupt: true
    },
    unit: {
      files: [
        'test/unit/**/*.spec.coffee'
      ],
      tasks: ['karma:unit']
    },
    integration: {
      files: [
        'test/integration/**/*.rb',
        '.tmp/scripts/**/*.js'
      ],
      tasks: ['exec:rspec']
    }
  };

  grunt.config('watch', config);
  grunt.task.run('watch');
});

лучшее и единственное рабочее решение есть:https://npmjs.org/package/grunt-focus Добавьте этот плагин, а затем :

focus: {
            sources: {
                include: ['js', 'html', 'css', 'grunt']
            },
            testu: {
                include: ['js', 'html', 'css', 'testu', 'grunt']
            },
            testi: {
                include: ['js', 'html', 'css', 'testu', 'testi', 'grunt']
            }
        },
        watch: {
            js: {
                files: paths.js,
                tasks: ['jshint'],
                options: {
                    livereload: true
                }
            },
            html: {
                files: paths.html,
                options: {
                    livereload: true
                }
            },
            css: {
                files: paths.css,
                tasks: ['csslint'],
                options: {
                    livereload: true
                }
            },
            testu: {
                files: ['test/**/*.js', 'test/**/*.css'],
                tasks: ['mochaTest'],
                options: {}
            },
            testi: {
                files: ['test/**/*.js', 'test/**/*.css'],
                tasks: ['exec:cleanTestDB', 'protractor_webdriver', 'protractor'],
                options: {}
            },
            grunt: {
                files: ['Gruntfile.js', 'server/config/env/*.js'],
                options: {
                    reload: true
                }
            }
        }

затем вы используете focus:sources или focus: testu в качестве вашего удобства.

JM.

grunt-concurrent или grunt-focus - оба хороших решения, но оба они ломаются livereload функциональность.

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

Вы можете сделать что-то подобное

grunt.config.merge({
  watch: {
    options: {
      livereload: true
    },
    C: {
      files: "js/dev/**/*.html",
      tasks: ["copy"]
    }
  }
});

grunt.registerTask('watch-forProd', function () {
  grunt.config.merge({
    watch: {
      A: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee", "requirejs"]
      }
    }
  });

  grunt.task.run('watch');
});

grunt.registerTask('watch-forDev', function () {
  grunt.config.merge({
    watch: {
      B: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee"]
      }
    }
  });

  grunt.task.run('watch');
});

grunt.registerTask("prod", ["watch-forProd"]);
grunt.registerTask("dev", ["watch-forDev"]);

Я знаю, что это не ответ непосредственно на вопрос, но мое решение теперь использовать глоток вместо хрюканья. С Gulp вы кодируете и не только настраиваете. Таким образом, вы более свободны делать то, что вы хотите.

JM.

сентябрь 2018

вам не нужно использовать grunt-concurrent больше grunt теперь имеет этот встроенный, вот пример из одного из моих текущих проектов...

module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        sass: {
            theme: {
                files: {
                    '../../web/sites/all/themes/ifafri/css/generated/theme_ifafri_master.css' : '../../web/sites/all/themes/ifafri/css/master.scss'
                }
            },
            bootstrap: {
                files: {
                    '../../web/sites/all/themes/ifafri/css/generated/theme_ifafri_bootstrap.css' : '../../web/sites/all/themes/ifafri/css/bootstrap/master.scss' 
                }
            }
        },
        watch: {
            theme: {
                files: '../../web/sites/all/themes/ifafri/css/*.scss',
                tasks: ['sass:theme'],
                options: {
                    spawn: false,
                    livereload: true,
                    nospawn: false
                }
            },
            bootstrap: {
                files: '../../web/sites/all/themes/ifafri/css/bootstrap/*.scss',
                tasks: ['sass:bootstrap'],
                options: {
                    spawn: false,
                    livereload: true,
                    nospawn: false
                }
            }
    }
    });
    grunt.loadNpmTasks('grunt-contrib-sass');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-livereload');
    grunt.registerTask('default',['watch']);
}

Concurrent отлично работает для меня

concurrent: {
            options: {
                logConcurrentOutput: true
            },
            set1: ['watch:html', 'watch:styles'],
        },

grunt.registerTask('default', 'watch');
grunt.registerTask('htmlcss', ['concurrent:set1']);

просто измените адрес порта и порт livereload. Например. если порт 9000 изменить его на 8000 и жить перезагрузить с 35729 до 36729