首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Grunt任务中的Node脚本检索输出

从Grunt任务中的Node脚本检索输出
EN

Stack Overflow用户
提问于 2015-02-19 09:39:19
回答 3查看 402关注 0票数 0

我是Grunt的新手,所以这可能是一个非常基本的问题。我有一个看起来像这样的Gruntfile.js:

代码语言:javascript
复制
/*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)来测试相同的代码,那么它工作得很好,例如

代码语言:javascript
复制
#!/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包,并获得返回值呢?

顺便说一下,我确实是通过执行以下操作来安装该包的:

代码语言:javascript
复制
$ npm install node-imagemagick

..。从包含Gruntfile.js的目录中。

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2015-02-19 10:06:58

编辑:

你的任务永远不会完成的原因是因为你在结束时返回的不明确:

代码语言:javascript
复制
return; <---

您正在中断对以下各项的异步调用:

代码语言:javascript
复制
im.identify(function(){
  //do async
})

return; //exit task

试试这个:

代码语言:javascript
复制
grunt.registerTask('measureText', function(done) {
    //omitting code

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

       done()
    })
})

函数参数done()告诉任务运行器,它应该在您执行某些异步操作之后结束,而不是在任何代码执行之前结束。

原件:

您的需求在每个脚本中看起来都非常不同。

代码语言:javascript
复制
require('imagemagick')

--- vs ---

require('node-imagemagick')

Grunt可能正在吞下这个错误

此外,我认为这是公正的:

代码语言:javascript
复制
npm install imagemagick
票数 0
EN

Stack Overflow用户

发布于 2015-02-20 00:57:49

我只是通过进一步的挖掘找到了答案,这里是:Using a node module within a Grunt Task fails

基本上,如果要接收回调,我的Grunt任务必须是异步的:

代码语言:javascript
复制
/*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
EN

Stack Overflow用户

发布于 2015-02-20 01:52:27

做了更多的研究后,我才能让它工作起来。首先,我将切换到imagemagick开发人员自述文件中推荐的这个库。

https://github.com/aheckmann/gm

但是,如果您想要使用未维护的库,这取决于您。

不管怎么说,下面是:

代码语言:javascript
复制
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()
   })
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28597314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档