我是Grunt的新手,所以这可能是一个非常基本的问题。我有一个看起来像这样的Gruntfile.js:
/*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方法identify来获取图像的宽度和高度(build/text.png)。当我运行上面的grunt脚本时,identify()回调没有输出。(这是上面的console.log行)。
然而,如果我创建一个Node脚本(例如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);
});那么如何从Grunt任务中调用Node包,并获得返回值呢?
顺便说一下,我确实是通过执行以下操作来安装该包的:
$ npm install node-imagemagick..。从包含Gruntfile.js的目录中。
谢谢!
发布于 2015-02-19 10:06:58
编辑:
你的任务永远不会完成的原因是因为你在结束时返回的不明确:
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发布于 2015-02-20 00:57:49
我只是通过进一步的挖掘找到了答案,这里是: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();
});
});
}; 当然,这意味着输出实际上不会出现在等号的两行之间,如果我把第二行保留在那里。
发布于 2015-02-20 01:52:27
做了更多的研究后,我才能让它工作起来。首先,我将切换到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()
})
})https://stackoverflow.com/questions/28597314
复制相似问题