16

我想在 node.js 代码中创建并运行 grunt 任务以供测试使用。

var foo = function() {
    var grunt = require("grunt");

    var options = {"blahblah": null} // ...creating dynamic grunt options, such as concat and jshint
    grunt.initConfig(options);
    grunt.registerTask('default', [/*grunt subtasks*/]);
}

但这不起作用。Grunt 似乎没有运行任何任务。我几乎可以肯定有一些 API 可以在没有命令行的情况下在外部运行 grunt 任务,但不知道该怎么做。

有什么办法吗?

4

2 回答 2

21

你可以。我不知道为什么有人需要这样做,因为目前 Grunt 是一个命令行工具警告:我不建议以这种方式运行 Grunt。但这里是:

var grunt = require('grunt');

// hack to avoid loading a Gruntfile
// You can skip this and just use a Gruntfile instead
grunt.task.init = function() {};

// Init config
grunt.initConfig({
  jshint: {
    all: ['index.js']
  }
});

// Register your own tasks
grunt.registerTask('mytask', function() {
  grunt.log.write('Ran my task.');
});

// Load tasks from npm
grunt.loadNpmTasks('grunt-contrib-jshint');

// Finally run the tasks, with options and a callback when we're done
grunt.tasks(['mytask', 'jshint'], {}, function() {
  grunt.log.ok('Done running tasks.');
});
于 2013-05-15T16:51:40.280 回答
14

您可以通过查看grunt-cli来获得有关如何从代码运行 grunt 的灵感,该项目是由 grunt 人员维护的项目。

Grunt 是从grunt-cli/bin/grunt中的代码启动的,您可以在grunt/lib/grunt/cli.js中阅读有关选项的更多信息。

我在这样的私人项目中使用它:

var grunt = require("grunt");
grunt.cli({
  gruntfile: __dirname + "/path/to/someGruntfile.js",
  extra: {key: "value"}
});

密钥“extra”将在 gruntfile 中作为grunt.option("extra")

这是一篇博文,描述了运行 grunt 任务的另一种方法:http: //andrewduthie.com/2014/01/14/running-grunt-tasks-without-grunt-cli/

于 2014-07-25T08:25:56.473 回答