Подтвердить что ты не робот

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

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

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

...
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 никогда не работает). Возможно ли сделать то, что я хочу?

4b9b3361

Ответ 1

Я нашел, используя grunt-concurrent работает:

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"]);

Ответ 2

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

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');
});

Ответ 3

Лучшее и единственное рабочее решение: 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
                }
            }
        }

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

JM.

Ответ 4

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"]);

Ответ 5

СЕНТЯБРЬ 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']);
}

Ответ 6

Не беспокоясь о grunt.registerTask() в Gruntfile.js, я иногда запускаю grunt как фоновые процессы, набирая в командной строке следующее:

$ grunt watch:A &
$ grunt watch:C &

Вы можете сделать команды как пакетный скрипт для большего удобства. Надеюсь, это поможет.

Ответ 7

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

JM.

Ответ 8

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

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

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

Ответ 9

Просто измените адрес порта и порт загрузки. Напр. если порт 9000, измените его на 8000 и перезагрузите с 35729 до 36729