Регистрация задач 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 >