gruntjs - que - npm grunt
¿Cómo obtener el nombre de la tarea grunt en la línea de comandos? (3)
Puedes usar grunt.util.hooker.hook
para esto.
Ejemplo (parte de Gruntfile.coffee):
grunt.util.hooker.hook grunt.task, (opt) ->
if grunt.task.current and grunt.task.current.nameArgs
console.log "Task to run: " + grunt.task.current.nameArgs
CMD :
C:/some_dir>grunt concat --cmp my_cmp
Task to run: concat
Running "concat:coffee" (concat) task
Task to run: concat:coffee
File "core.coffee" created.
Done, without errors.
También hay un hack que he usado para evitar la ejecución de ciertas tareas:
grunt.util.hooker.hook grunt.task, (opt) ->
if grunt.task.current and grunt.task.current.nameArgs
console.log "Task to run: " + grunt.task.current.nameArgs
if grunt.task.current.nameArgs is "<some task you don''t want user to run>"
console.log "Ooooh, not <doing smth> today :("
exit() # Not valid. Don''t know how to exit :), but will stop grunt anyway
CMD, cuando está permitido :
C:/some_dir>grunt concat:coffee --cmp my_cmp
Running "concat:coffee" (concat) task
Task to run: concat:coffee
File "core.coffee" created.
Done, without errors.
CMD, cuando se previene :
C:/some_dir>grunt concat:coffee --cmp my_cmp
Running "concat:coffee" (concat) task
Task to run: concat:coffee
Ooooh, not concating today :(
Warning: exit is not defined Use --force to continue.
Aborted due to warnings.
Para personalizar mis tareas grunt, necesito acceso al nombre de la tarea grunt que se indica en la línea de comandos al iniciar grunt.
Las opciones no son un problema, ya que está bien documentado (grunt.options). También está bien documentado cómo averiguar el nombre de la tarea, cuando se ejecuta una tarea ronca .
Pero necesito acceso al nombre de la tarea antes.
Por ejemplo, el usuario escribe grunt build --target=client
Al configurar el trabajo en mi Gruntfile.js
, puedo usar grunt.option(''target'')
para obtener ''client''
.
Pero, ¿cómo puedo obtener la build
de parámetros antes de que comience la compilación de tareas?
Cualquier orientación es muy apreciada!
Su archivo grunt es básicamente una función. Intenta agregar esta línea a la parte superior:
module.exports = function( grunt ) {
/*==> */ console.log(grunt.option(''target''));
/*==> */ console.log(grunt.cli.tasks);
// Add your pre task code here...
Ejecutar con grunt build --target=client
debería darle la salida:
client
[ ''build'' ]
En ese momento, puede ejecutar cualquier código que necesite antes de ejecutar su tarea, incluidos los valores de configuración con nuevas dependencias.
Una forma mejor es usar grunt.task.current
que tiene información sobre la tarea actualmente en ejecución, incluida una propiedad de name
. Dentro de una tarea, el contexto (es decir, this
) es el mismo objeto. Asi que . . .
grunt.registerTask(''foo'', ''Foobar all the things'', function() {
console.log(grunt.task.current.name); // foo
console.log(this.name); // foo
console.log(this === grunt.task.current); // true
});
Si la build
es un alias para otras tareas y solo quiere saber qué comando se escribió que condujo a la ejecución de la tarea actual, normalmente uso process.argv[2]
. Si examinas process.argv
, verás que argv[0]
es node
(porque grunt
es un proceso de node
), argv[1]
es grunt
, y argv[2]
es la tarea real de gruñido (seguida de cualquier parámetro en el resto de argv
).
EDITAR:
Ejemplo de salida de console.log(grunt.task.current)
en [email protected] desde dentro de una tarea (no puede tener una tarea actual de no una tarea actual).
{
nameArgs: ''server:dev'',
name: ''server'',
args: [],
flags: {},
async: [Function],
errorCount: [Getter],
requires: [Function],
requiresConfig: [Function],
options: [Function],
target: ''dev'',
data: { options: { debugPort: 5858, cwd: ''server'' } },
files: [],
filesSrc: [Getter]
}