Регистрация задач Grunt, код которых находится во внешних файлах JavaScript

Я написал функцию, которую я хотел бы использовать в качестве задачи Grunt. Я могу сделать это, добавив это в файл Grunt:

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

Однако имеет смысл хранить код функции в отдельном файле. Я планирую определить кучу этих пользовательских задач, и я не хочу раздувать Gruntfile.

Я не уверен, какой предпочтительный способ регистрации таких задач. Я нашел это для работы:

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

Итак, у меня есть встроенная функция, как в первом примере, но на этот раз я загружаю внешний файл и вызываю его немедленно. В этом внешнем файле я, конечно, должен написать:

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

Это работает, но это кажется хакером. Есть ли более правильный способ сделать это?

Ответы

Ответ 1

Короткий ответ: альтернатива этому

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

Ответ 2

У меня была аналогичная проблема.

Я хотел модулизовать конфигурацию grunt и настраиваемые задачи по функциям (большие блоки UX/UI), а не по техническим характеристикам. И я хотел сохранить файлы конфигурации рядом с файлами задач... (лучше при работе с большой старой кодовой базой с разнообразной командой - 5 человек с различными знаниями JS)

Итак, я выполнил свои задачи, такие как Красимир.

В файле grunt я написал:

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

Здесь вы найдете полный шаблонный файл grunt (внешняя конфигурация и загрузка задач): https://gist.github.com/0gust1/7683132 p >