17

我编写了一个函数,我想将它用作 Grunt 任务。我可以通过将其添加到 Gruntfile 来做到这一点:

grunt.registerTask('foo', function () {
    // code here
});

但是,将函数代码保存在单独的文件中更有意义。我计划定义一堆这些自定义任务,我不想让 Gruntfile 变得臃肿。

我不确定注册此类任务的首选方式是什么。我发现这个工作:

grunt.registerTask('foo', function () {
    require('./path/to/foo.js')(grunt);
});

所以,我有第一个例子中的内联函数,但是这一次,我正在加载一个外部文件并立即调用它。在那个外部文件中,我当然必须写:

module.exports = function (grunt) {
    // code here
}

这行得通,但感觉很hackish。有没有更合适的方法来做到这一点?

4

2 回答 2

24

简短的回答:这个的替代方案

grunt.registerTask('foo', function () {
    require('./path/to/foo.js')(grunt);
});

http://gruntjs.com/api/grunt#grunt.loadtasks

长答案:

通常,当您在外部文件中有任务时,它们会被用作其他 nodejs 模块。因此,如果这是您将在多个项目中使用的东西,您可能需要在注册表中注册它。稍后在您的 Gruntfile.js 中,您将拥有:

grunt.loadNpmTasks('yout-module-here');

咕噜声的文档说:

Load tasks from the specified Grunt plugin. This plugin must be installed locally via npm, and must be relative to the Gruntfile

但是,如果您不想将任何内容上传到注册表,则应使用loadTasks

grunt.loadTasks('path/to/your/task/directory');

因此,一旦加载了任务,您就可以在配置中使用它。

这是放置在外部文件中的简单 grunt 任务:

'use strict';

module.exports = function(grunt) {

    grunt.registerMultiTask('nameoftask', 'description', function() {

        var self = this;

        // this.data here contains your configuration

    });
};

后来在 Gruntfile.js

grunt.initConfig({
    nameoftask: {
        task: {
            // parameters here
        }
    }
});
于 2013-09-05T13:59:24.037 回答
1

我有一个类似的问题。

我想通过功能(大的 UX/UI 块)而不是技术特性来模块化我的 grunt 配置和自定义任务。而且我想将配置文件保留在任务文件旁边......(在与不同团队一起处理大型遗留代码库时更好 - 5 人具有不同的 JS 知识)

所以我像克拉西米尔一样将我的任务外化了。

在 gruntfile 中,我写道:

//power of globbing for loading tasks
var tasksLocations = ['./grunt-config/default_tasks.js', './grunt-config/**/tasks.js'];

var taskFiles = grunt.file.expand({
    filter: "isFile"
  }, tasksLocations);

taskFiles.forEach(function(path) {
  grunt.log.writeln("=> loading & registering : " + path);
  require(path)(grunt);
});

您将在此处找到整个样板 gruntfile(外部配置和任务加载): https ://gist.github.com/0gust1/7683132

于 2013-12-05T18:57:14.040 回答