2013-09-05 9 views
15

Napisałem funkcję, którą chciałbym użyć jako zadanie Grunt. Mogę to zrobić, dodając to do Gruntfile:Rejestrowanie zadań Grunta, których kod znajduje się w zewnętrznych plikach JavaScript

Jednak lepiej jest zachować kod funkcji w oddzielnym pliku. Mam zamiar zdefiniować kilka takich niestandardowych zadań i nie chcę nadpisywać pliku Gruntfile.

Nie jestem pewien, jaki jest preferowany sposób rejestrowania takich zadań. Znalazłem to do pracy:

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

Tak, mam funkcję inline jak w przykładzie na pięści, ale tym razem, jestem ładowanie zewnętrznego pliku i powołując go natychmiast. W tym pliku zewnętrznym muszę oczywiście napisać:

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

Działa, ale czuje się hackish. Czy istnieje lepszy sposób na zrobienie tego?

Odpowiedz

22

Krótka odpowiedź: Alternatywą dla tego

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

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

Długa odpowiedź:

Normalnie, gdy masz zadania w plikach zewnętrznych nie są podawane jako moduły innych nodejs. Tak więc, jeśli jest to coś, co będziesz używał w kilku projektach, możesz zarejestrować go w rejestrze. Później wewnątrz firmy Gruntfile.js trzeba będzie:

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

dokumentacja grunt mówi:

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

Jednakże, jeśli nie chcesz przesłać coś do rejestru należy użyć loadTasks

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

Po załadowaniu zadania można go użyć w swojej konfiguracji.

Tutaj jest prostym zadaniem grunt umieszczony w zewnętrznym pliku:

'use strict'; 

module.exports = function(grunt) { 

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

     var self = this; 

     // this.data here contains your configuration 

    }); 
}; 

A później w Gruntfile.js

grunt.initConfig({ 
    nameoftask: { 
     task: { 
      // parameters here 
     } 
    } 
}); 
+0

i jak mogę ponownie napisać moja funkcja jako zadanie? Jaka byłaby najprostsza konfiguracja. Po prostu mam funkcję, którą chcę powiązać z nazwą, aby móc wywołać ją z 'grunt name' w linii poleceń. –

+0

Właśnie zredagowałem moją odpowiedź. – Krasimir

+0

Próbowałem tego wzoru. To nie działa. W wierszu poleceń pojawia się komunikat "Ostrzeżenie: Zadanie" foo "nie znaleziono". Próbowałem określić ścieżkę z wiodącym '. /', Wiodącym '/' i bez nich. –

0

miałem podobny problem.

Chciałem modularyzować moje konfiguracje i niestandardowe zadania według funkcjonalności (duże bloki UX/UI), a nie przez funkcje techniczne. I chciałem zachować pliki konfiguracyjne obok plików zadań ... (lepiej, gdy pracuję nad dużym kodem źródłowym ze zróżnicowanym zespołem - 5 osób o różnej wiedzy JS).

Uzależniłem więc moje zadania, tak jak Krasimir.

W gruntfile pisałem:

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

Znajdziesz cały szablonowe gruntfile tutaj (zewnętrzny config i zadania ładowanie):https://gist.github.com/0gust1/7683132

+0

uzyskiwanie błędów "Zadania" zadań "rejestrowania". Inicjowanie konfiguracji ... OK Ładowanie zadań "scp.js" ... OK >> Żadne zadania nie zostały zarejestrowane lub nie zostały zarejestrowane. Ładowanie zadań Gruntfile.js ... ERROR' – shab

Powiązane problemy