0

私は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 を含むディレクトリから。

ありがとう!

4

3 に答える 3

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

もちろん、これは、等号の 2 行をそのままにしておくと、実際には出力が 2 行の等号の間に表示されないことを意味します。

于 2015-02-19T16:57:48.727 に答える