59

是否可以同时运行两个监视任务?

我知道我可以在手表设置中执行任意数量的任务,只需启动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 (开发)之间的唯一区别是缩小和连接。我不需要同时启动AB任务。

首先我带着这个想法

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

但这没有用。只是首先观察任务正在工作(C从不工作)。有可能做我想做的事吗?

4

9 回答 9

74

我发现使用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"]);
于 2013-07-12T10:47:28.540 回答
18

编辑:并发现在有一个logConcurrentOutput选项!更多信息在这里:https ://github.com/sindresorhus/grunt-concurrent#logconcurrentoutput 。

Watch 是一个奇怪的并发但阻塞的任务,所以你必须要有创造力才能让类似多任务的功能正常工作。

Concurrent 会丢失监视任务的所有输出,这并不理想。

尝试在自定义任务中动态编写配置对象:

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');
});
于 2013-10-11T16:50:11.937 回答
12

最好且唯一可行的解​​决方案是: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。

于 2014-05-09T08:35:06.050 回答
7

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

于 2014-12-31T12:16:13.230 回答
4

2018 年 9 月

您不再需要使用 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']);
}
于 2018-09-14T16:44:27.337 回答
1

不用担心 Gruntfile.js 中的 grunt.registerTask(),我有时通过在命令行中键入以下命令将 grunt 作为后台进程运行:

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

为了更方便,您可以将命令制作为批处理脚本。希望它有所帮助。

于 2019-07-04T11:24:38.920 回答
0

我知道这不能直接回答这个问题,但我现在的解决方案是使用 Gulp 而不是 Grunt。使用 Gulp,您可以编写代码,而不仅仅是配置。所以你可以更自由地做你想做的事。

JM。

于 2015-10-27T21:15:43.850 回答
0

只需更改端口地址和 livereload 端口。例如。如果端口是 9000 将其更改为 8000 并将实时重新加载从 35729 到 36729

于 2016-03-10T16:46:49.413 回答
-1

并发对我来说很好

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

grunt.registerTask('default', 'watch');
grunt.registerTask('htmlcss', ['concurrent:set1']);
于 2015-12-12T19:29:32.923 回答