2015-02-19 2 views
0

Я довольно новичок в Grunt, так что это может быть довольно простой вопрос. У меня есть Gruntfile.js, который выглядит следующим образом:Получение результата из сценария узла в задаче Grunt

/*global module:false*/ 
module.exports = function (grunt) { 

    grunt.initConfig({ 

    }); 

    grunt.registerTask('default', 'measureText'); 

    grunt.registerTask('measureText', 'Measures size of text', function() { 
    grunt.log.writeln('========================================================================'); 
    grunt.log.writeln('= output of ImageMagick should be on next line:      ='); 
    var im = require("node-imagemagick"); 

    im.identify(['-format', '%wx%h', 'build/text.png'], function(err, output){ 
     if (err) throw err; 
     console.log('dimension: '+output); // <-- NOTHING WRITTEN! 
    }); 

    grunt.log.writeln('========================================================================'); 
    return; 
    });  
}; 

Как вы можете видеть, это вызов метода node-imagemagick идентификации, чтобы получить ширину и высоту изображения (строительство/text.png). Когда я запускаю свой скрипт grunt, нет выхода из callback ident(). (Это строка console.log выше).

Однако, если я создаю сценарий узла (например, test-node-imagemagick.js) для проверки того же кода, он работает просто отлично, например.

#!/usr/bin/env node 

var im = require("node-imagemagick"); 
im.identify(['-format', '%wx%h', 'build/text.png'], function(err, output){ 
    if (err) throw err; 
    console.log('dimension: '+output); 
}); 

Как я могу назвать пакеты Node из задач Grunt и получить возвращаемые значения?

Кстати, я установить пакет, выполнив:

$ npm install node-imagemagick 

... из каталога, содержащего Gruntfile.js.

Спасибо!

ответ

0

Edit:

Причина ваша задача никогда не завершается из-за ваше неоднозначное возвращение в конце:

return; <--- 

Вы срыв вызова асинхронного к:

im.identify(function(){ 
    //do async 
}) 

return; //exit task 

Попробуйте это :

grunt.registerTask('measureText', function(done) { 
    //omitting code 

    im.identify(function(){ 
     //do async stuff 

     done() 
    }) 
}) 

Функциональный аргумент done() сообщает бегун задачи, что он должен закончиться после того, как вы сделаете что-то асинхронное, а не закончите до того, как какой-либо из этого кода выполнится.

Оригинал:

Ваш требуется выглядит очень разные в каждом из этих сценариев.

require('imagemagick') 

--- vs --- 

require('node-imagemagick') 

Grunt, вероятно, глотания ошибку

Кроме того, я думаю, его просто:

npm install imagemagick 
+0

Спасибо для ловли, но это было только потому, что я пытался несколько вещей, в то время очистки файла на тест-случае. Я проверил, и пакет «node-imagemagick» - это просто вилка «imagemagick». Если я исправлю их, чтобы они были «node-imagemagick». Я обновлю свой оригинальный вопрос, чтобы избежать путаницы. – antun

+0

было бы неплохо поместите ваш require() выше функции grunt в верхней части файла, а не в пределах регистрации задачи. Кроме того, вместо того, чтобы бросать ошибку, попробуйте вывести ее в stderr с помощью console.error() или grunt.log.error() – sctskw

+0

Спасибо за предложение. Я попытался переместить строку var im = require ("node-imagemagick") в начало (справа внутри module.exports = function (grunt) {), но результат тот же. Я также попробовал написав console.log (err), а также grunt.log.writeln (err), но ни одна из них не сообщила о какой-либо ошибке. Кроме того, im является действительным экземпляром объекта ImageMagick, если я делаю console.log (im) . – antun

0

Я только что нашел ответ, еще немного копания, здесь: Using a node module within a Grunt Task fails

В основном, моя задача Grunt должна быть асинхронной, если она должна получить обратный вызов:

/*global module:false*/ 
module.exports = function (grunt) { 
    var im = require("node-imagemagick"); 


    grunt.initConfig({ 
    }); 

    grunt.registerTask('default', 'measureText'); 

    grunt.registerTask('measureText', 'Measures size of text', function() { 
    var done = this.async(); // <-- Make the task asynchronous! 
    grunt.log.writeln('========================================================================'); 
    grunt.log.writeln('= output of ImageMagick should be on next line:      ='); 

    im.identify(['-format', '%wx%h', 'build/text.png'], function(err, output){ 
     if (err) throw err; 
     console.log('dimension: '+output); 
     done(); 
    }); 
    });  
}; 

Конечно, это означает, что выход не будет отображаться между двумя строками равных знаков, если бы я сохранил вторую строку там.

0

Выполнение еще нескольких исследований Я смог заставить это работать. Во-первых, я бы переключился на эту библиотеку, рекомендованную разработчиком README для imagemagick.

https://github.com/aheckmann/gm

Но это до вас, если вы хотите использовать библиотеку брошенных.

Во всяком случае здесь:

grunt.registerTask('measureText', function(done) { 
    //omitting code 

    var done = this.async() //create async task 

    im.identify('/path/to/image', function(err, output){ 
    //do async stuff 
    console.log('dimension: %s', output) 
    done() 
    }) 

    //or use gm 
    gm('/path/to/image') 
    .size(function(err, size) { 
     console.log('gm size: %s', size) 
     done() 
    }) 
}) 
Смежные вопросы