Как создать и организовать конфигурацию и зарегистрировать задачи grunt
У меня есть проект, где я использую grunt
обработать мой Js
а также SASS
файлы.
В тот момент, когда мне нужно что-то обработать, мне нужно вызвать все задачи внутри моего gruntfile.js
даже если я хочу изменить только один модуль, или только SASS
файл.
Есть ли способ создать пользовательскую задачу, запустить только часть sass, а другой - создать только процесс модуля, где я могу вызвать эту задачу из приглашения?
Это то, что я пытался без успеха:
module.exports = function(gruntHome) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
/* @CONCAT */
concat: {
home : {
src: 'src/app/component/home/*.js',
dest: 'src/app/component/home/concat/concat_config.js'
}
},
/* @ANNOTATE */
ngAnnotate: {
options: {
add: true
},
home: {
files: {
'src/app/component/home/concat/concat_config.js': 'src/app/component/home/concat/concat_config.js'
}
}
},
/* @UGLIFY */
uglify: {
home: {
src: 'src/app/component/home/concat/concat_config.js',
dest: 'app/component/home/home.min.js'
}
}
});
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-ng-annotate');
grunt.registerTask('gruntTask', ['concat', 'ngAnnotate', 'uglify']);
};
Если это невозможно, есть ли другой способ достичь этой цели? Потому что мой gruntfile.js огромен, и иногда на его обработку уходит много времени, даже если мне не нужно все обрабатывать.
Редактировать:
Эта ссылка здесь является связанным вопросом, который я задал, следуя инструкциям по этому вопросу. Это решит некоторые возможные проблемы, которые у вас возникнут при попытке сделать то, что я сделал здесь. Надеюсь, что это может помочь другим людям.
1 ответ
Вот как вы можете организовать свои основные задачи:
- config: задачи по умолчанию
- register: псевдонимы задач, которые вызывают несколько задач по умолчанию
Некоторые правила, которые вы должны соблюдать:
- имя вашего файла должно совпадать с именем вашей задачи (например, ngAnnotate.js -> task: ngAnnotate)
- сгруппируйте ваши задачи по конфигурации с помощью плагинов Grunt в одном файле. Не смешивайте grunt-плагины в задачах конфигурации, для этой задачи есть задачи Register.
- имя задачи конфигурации и задачи регистрации являются общими, то вы не можете установить
home
Задача конфигурации иhome
зарегистрируйте задачу, потому что когда вы вызываете ее с помощью grunt home, grunt не может знать задачу, к которой вы обращаетесь.
├── Gruntfile.js
└── grunt
├── config
│ ├── sass.js
│ ├── concat.js
│ └── uglify.js
└── register
├── GroupOfTasks.js
└── AnotherGroupOfTasks.js
Ваш Gruntfile.js
загрузит и настроит все задачи в grunt/config
а также grunt/register
папка с этим кодом:
module.exports = function(grunt) {
// Load the include-all library in order to require all of our grunt
// configurations and task registrations dynamically.
var includeAll;
try {
includeAll = require('include-all');
}
catch (e0) {
console.error('Could not find `include-all` module.');
console.error('Skipping grunt tasks...');
console.error('To fix this, please run:');
console.error('npm install include-all --save-dev');
console.error();
}
/**
* Loads Grunt configuration modules from the specified
* relative path. These modules should export a function
* that, when run, should either load/configure or register
* a Grunt task.
*/
function loadTasks(relPath) {
return includeAll({
dirname: require('path').resolve(__dirname, relPath),
filter: /(.+)\.js$/
}) || {};
}
/**
* Invokes the function from a Grunt configuration module with
* a single argument - the `grunt` object.
*/
function invokeConfigFn(tasks) {
for (var taskName in tasks) {
if (tasks.hasOwnProperty(taskName)) {
tasks[taskName](grunt);
}
}
}
// Load task functions
var taskConfigurations = loadTasks('./grunt/config'),
registerDefinitions = loadTasks('./grunt/register');
// Run task functions to configure Grunt.
invokeConfigFn(taskConfigurations);
invokeConfigFn(registerDefinitions);
};
Ваша задача конфигурации должна выглядеть так (например: sass.js
):
module.exports = function(grunt) {
grunt.config.set('sass', {
dev: {
options: {
sourceMap: false
},
files: {
'main.css': 'main.scss'
}
}
});
grunt.loadNpmTasks('grunt-sass');
};
Вы сможете запустить конфигурационную задачу с grunt sass
запустить все нахальное задание или grunt sass:dev
запустить только одну задачу.
И задача регистрации должна выглядеть так (например: SassAndConcat
задача для запуска sass
а также concat
задача):
module.exports = function(grunt) {
grunt.registerTask('SassAndConcat', [
'sass:dev',
'concat:dev',
]);
};
И теперь ты сможешь бежать grunt SassAndConcat
,
Если вы понимаете это, вы сможете более эффективно выполнять свои задачи, выполняя правильные задачи в нужное время.
Не забудьте установить include-all
Модуль NPM для динамического запроса всех наших конфигураций и регистрации задач.