load-grunt-configs和bower.install()使用grunt

时间:2015-01-25 15:28:53

标签: javascript node.js gruntjs bower

我正在尝试将现有的Grunt文件转换为更小的文件,以使概览更容易。但是我碰到了一个凹凸。我正在使用bower.install来安装我的项目依赖项。 我的文件夹结构如下所示:

package.json
bower.json
config
--install.js
--default.js //Empty for now
gruntfile.js

我的Gruntfile现在看起来像这样:

'use strict';
module.exports = function(grunt) {
  var npmDependencies = require('./package.json').devDependencies;
  require('load-grunt-tasks')(grunt);

  var configs = {
    config : {
      paths : {
        "build" : ["grunts/*.js*", "package.json", "bower.json", "Gruntfile.js"],
      }
    }
  };

  var loadConfigs = require( 'load-grunt-configs' );
  configs = loadConfigs( grunt, configs );
  // Project configuration.
  grunt.initConfig( configs );
}

我的install.js看起来像这样:

module.exports = function(grunt) {
  var done = grunt.async();
  var bower = require('bower').commands;
  bower.install().on('end', function(data) {
    done();
  }).on('data', function(data) {
    console.log(data);
  }).on('error', function(err) {
    console.error(err);
    done();
  });
}

然而,这不起作用,因为我收到错误:

>> TypeError: Object #<Object> has no method 'async'

如果我删除所有async-clutter(我最终想保留),那么文件看起来要简单得多:

module.exports = function(grunt) {
    var bower = require('bower').commands;
    bower.install();
}

我仍然收到以下错误:

>> TypeError: Cannot call method 'hasOwnProperty' of undefined

我对这个话题相当新,到目前为止(将所有内容都放在一个文件中)它运行良好。现在的大问题:我如何回到那一点;)

1 个答案:

答案 0 :(得分:0)

install.js存在一些问题:

1)grunt对象不公开异步函数,这是第一个错误的原因。 async函数可用于grunt任务,因此应该从任务中调用它  2)当using node modules for configuration时, load-grunt-configs 需要一个返回对象的函数,例如:

//config/jshint.js
module.exports = function(grunt, options){
     return {
         gruntfile       : {
             src : "Gruntfile.js"
         }
     }
 } 

在你的情况下,函数不返回任何内容, load-grunt-configs 失败并出现Cannot call method 'hasOwnProperty' of undefined错误。

以下内容应该有效:

module.exports = function(grunt) {
  return grunt.registerTask("bower", function() {
      var done = this.async();
      var bower = require('bower').commands;
      bower.install().on('end', function(data) {
        done();
      }).on('data', function(data) {
        console.log(data);
      }).on('error', function(err) {
        console.error(err);
        done();
      });
  });
}