В этой главе давайте узнаем о создании задач . Каждый раз, когда вы запускаете Grunt, для запуска указывается одна или несколько задач, которые уведомляют Grunt о том, что вы хотите, чтобы он делал. Если вы укажете задание по умолчанию , оно будет выполняться по умолчанию.
Alias Tasks
Всякий раз, когда указан список задач, одна или несколько других задач могут быть связаны с новой задачей. Запуск псевдонима, в свою очередь, будет запускать все указанные задачи в списке задач . Аргумент taskList должен быть массивом задач, как показано ниже —
grunt.registerTask(taskName, [description, ] taskList)
Например, когда вы определяете список задач с помощью задач jshint , concat и uglify и задаете имя задачи по умолчанию , все перечисленные задачи будут запускаться автоматически, если Grunt выполняется без указания каких-либо задач.
grunt.registerTask('default', ['jshint', 'concat', 'uglify']);
Вы также можете указать аргументы задачи, как показано ниже —
grunt.registerTask('dist', ['concat:dist', 'uglify:dist']);
В приведенной выше задаче псевдоним dist выполняет задачи concat и uglify .
Многозадачность
Каждый раз, когда вы запускаете несколько задач, Grunt ищет одноименное свойство в конфигурации Grunt. Эти задачи могут иметь несколько конфигураций, которые будут определены с использованием произвольно названных целей .
При указании задачи и цели будет обрабатываться только указанная конфигурация цели.
grunt concat:foo
Приведенная выше команда будет запускать только целевой foo .
Когда вы указываете только задачу, все цели будут обработаны.
grunt concat
Приведенная выше команда будет перебирать все цели задачи concat .
Когда вы переименовываете задачу с помощью grunt.task.renameTask , свойство с новым именем задачи ищется в объекте конфигурации Grunt.
grunt.initConfig({ log: { foo: [1, 2, 3], bar: 'Welcome to tutorialspoint', sap: true } }); grunt.registerMultiTask('log', 'Log stuff.', function() { grunt.log.writeln(this.target + ': ' + this.data); });
В приведенном выше примере мультизадача будет регистрировать foo: 1,2,3, если Grunt запускался через grunt log: foo, или он будет регистрировать bar: Добро пожаловать в tutorialspoint при каждом запуске через grunt log: bar . Он будет записывать foo: 1,2,3, затем bar: Добро пожаловать в tutorialspoint, затем sap: true, когда Grunt запускается как журнал grunt .
Основные задачи
Каждый раз, когда вы запускаете базовую задачу, Grunt не будет искать конфигурацию или среду. Вместо этого он запускает указанную функцию задачи, передает все разделенные двоеточием аргументы, указанные в качестве аргументов функции.
grunt.registerTask(taskName, [description, ] taskFunction)
В следующем примере задача регистрирует foo, проверяя 123 , выполняется ли Grunt с помощью команды grunt foo: testing: 123 . Всякий раз, когда задача запускается без аргументов как grunt foo , задача будет записывать в журнал foo, без аргументов .
grunt.registerTask('foo', 'A simple task to logs stuff.', function(arg1, arg2) { if (arguments.length === 0) { grunt.log.writeln(this.name + ", no args"); } else { grunt.log.writeln(this.name + ", " + arg1 + " " + arg2); } });
Пользовательские задачи
Если вы не хотите следовать многозадачной структуре, вы можете определить свою пользовательскую задачу, как показано ниже —
grunt.registerTask('default', 'My "default" task description.', function() { grunt.log.writeln('Currently running the "default" task.'); });
Можно выполнить задачу внутри другой задачи, как показано ниже —
grunt.registerTask('foo', 'My "foo" task.', function() { // Enqueue bar and baz tasks, to run after foo completes, in-order. grunt.task.run('bar', 'baz'); // Or: grunt.task.run(['bar', 'baz']); });
Вы также можете создавать асинхронные задачи, как показано ниже —
grunt.registerTask('asyncfoo', 'My "asyncfoo" task.', function() { // Force task into async mode and grab a handle to the done() function. var done = this.async(); // Run some sync stuff. grunt.log.writeln('Processing your task..'); // Run some async stuff. setTimeout(function() { grunt.log.writeln('Finished!'); done(); }, 1000); });
Вы можете создавать задачи, которые могут получить доступ к их имени и аргументам, как показано ниже —
grunt.registerTask('foo', 'My task "foo" .', function(a, b) { grunt.log.writeln(this.name, a, b); }); // Usage: // grunt foo // logs: "foo", undefined, undefined // grunt foo:bar // logs: "foo", "bar", undefined // grunt foo:bar:baz // logs: "foo", "bar", "baz"
Вы можете создать свою задачу таким образом, чтобы, когда бы ни регистрировались какие-либо ошибки, задачи могут завершиться неудачей, как показано ниже —
grunt.registerTask('foo', 'My task "foo" .', function() { if (failureOfSomeKind) { grunt.log.error('This is an error message.'); } // If this task had errors then fail by returning false if (ifErrors) { return false; } grunt.log.writeln('This is success message'); });
Всякий раз, когда задача не выполняется, каждая следующая задача будет завершена, если не указан параметр —force .
grunt.registerTask('foo', 'My task "foo" .', function() { // Fail synchronously. return false; }); grunt.registerTask('bar', 'My task "bar" .', function() { var done = this.async(); setTimeout(function() { // Fail asynchronously. done(false); }, 1000); });
Задачи могут зависеть от других задач для успешного выполнения. Помните, что grunt.task.requires на самом деле не будет выполнять другие задачи, вместо этого он будет только проверять, выполнено ли оно и не удалось ли это.
grunt.registerTask('foo', 'My task "foo" .', function() { return false; }); grunt.registerTask('bar', 'My task "bar" .', function() { // Fail task if foo task failed or never ran. grunt.task.requires('foo'); // This code executes if the foo task executed successfully. grunt.log.writeln('Hello, World.. Welcome to Tutorialspoint!..'); }); // Usage: // grunt foo bar doesn't log, because foo failed to execute. // **Note: This is an example of space-separated sequential commands, // (similar to executing two lines of code: `grunt foo` then `grunt bar`) // grunt bar doesn't log, because foo never ran.
Задачи могут даже потерпеть неудачу, когда требуемые свойства конфигурации не найдены.
grunt.registerTask('foo', 'My task "foo" .', function() { // Fail task if meta.name config properties is missing // Format 1: String grunt.config.requires('meta.name'); // or Format 2: Array grunt.config.requires(['meta', 'name']); // Log... conditionally. grunt.log.writeln('This only log if meta.name is defined in the config.'); });
Задачи могут получить доступ к свойствам конфигурации, как показано ниже —