javascript grunt 出现一个奇怪的错误:Object Gruntfile.js 没有方法“flatten”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19130018/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-27 14:29:24  来源:igfitidea点击:

Getting a strange error with grunt: Object Gruntfile.js has no method 'flatten'

javascriptnode.jsnpmgruntjs

提问by necromancer

I am getting this strange error trying to run grunt: TypeError: Object Gruntfile.js has no method 'flatten'

我在尝试运行 grunt 时遇到了这个奇怪的错误: TypeError: Object Gruntfile.js has no method 'flatten'

I am new to node.js, npm, grunt, etc. I thought I did a decent install of node, npm, grunt but may be I missed something. Is there a way to verify the install??

我是 node.js、npm、grunt 等的新手。我以为我安装了不错的 node、npm、grunt,但可能我错过了一些东西。有没有办法验证安装?

$ cat xx
$ grunt

/home/cl/node_modules/grunt/node_modules/findup-sync/lib/findup-sync.js:33
    }).flatten().uniq().value();
       ^
TypeError: Object Gruntfile.js has no method 'flatten'
    at Object.module.exports [as findup] (/home/cl/node_modules/grunt/node_modules/findup-sync/lib/findup-sync.js:33:8)
    at Task.task.init (/home/cl/node_modules/grunt/lib/grunt/task.js:414:16)
    at Object.grunt.tasks (/home/cl/node_modules/grunt/lib/grunt.js:113:8)
    at Object.module.exports [as cli] (/home/cl/node_modules/grunt/lib/grunt/cli.js:38:9)
    at Object.<anonymous> (/usr/lib/node_modules/grunt-cli/bin/grunt:41:20)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

The offending line/file:

有问题的行/文件:

/*
 * findup-sync
 * https://github.com/cowboy/node-findup-sync
 *
 * Copyright (c) 2013 "Cowboy" Ben Alman
 * Licensed under the MIT license.
 */

'use strict';

// Nodejs libs.
var path = require('path');

// External libs.
var glob = require('glob');
var _ = require('lodash');

// Search for a filename in the given directory or all parent directories.
module.exports = function(patterns, options) {
  // Normalize patterns to an array.
  if (!Array.isArray(patterns)) { patterns = [patterns]; }
  // Create globOptions so that it can be modified without mutating the
  // original object.
  var globOptions = Object.create(options || {});
  globOptions.maxDepth = 1;
  globOptions.cwd = path.resolve(globOptions.cwd || '.');

  var files, lastpath;
  do {
    // Search for files matching patterns.
    files = _(patterns).map(function(pattern) {
      return glob.sync(pattern, globOptions);
    }).flatten().uniq().value(); // <--------- OFFENDING LINE
    // Return file if found.
    if (files.length > 0) {
      return path.resolve(path.join(globOptions.cwd, files[0]));
    }
    // Go up a directory.
    lastpath = globOptions.cwd;
    globOptions.cwd = path.resolve(globOptions.cwd, '..');
  // If parentpath is the same as basedir, we can't go any higher.
  } while (globOptions.cwd !== lastpath);

  // No files were found!
  return null;
};

Output of ls -l node_modules/:

的输出ls -l node_modules/

$ ls -l node_modules/
total 20
drwxrwxr-x. 6 a a 4096 Oct  2 00:42 grunt
drwxrwxr-x. 4 a a 4096 Oct  2 00:42 grunt-contrib-compass
drwxrwxr-x. 6 a a 4096 Oct  2 00:42 grunt-contrib-jshint
drwxrwxr-x. 6 a a 4096 Oct  2 00:42 grunt-contrib-watch
drwxrwxr-x. 4 a a 4096 Oct  2 00:42 grunt-dustjs

Output of npm list:

的输出npm list

$ npm list
[email protected] /home/a/prep/main/web/client
├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ └─┬ [email protected]
│   ├─┬ [email protected]
│   │ └─┬ [email protected]
│   │   └── [email protected]
│   ├── [email protected]
│   ├─┬ [email protected]
│   │ ├── [email protected]
│   │ └── [email protected]
│   ├── [email protected]
│   └── [email protected]
├─┬ [email protected]
│ ├─┬ [email protected]
│ │ └─┬ [email protected]
│ │   ├─┬ [email protected]
│ │   │ ├── [email protected]
│ │   │ └── [email protected]
│ │   ├── [email protected]
│ │   └─┬ [email protected]
│ │     ├── [email protected]
│ │     └── [email protected]
│ └─┬ [email protected]
│   ├── [email protected]
│   ├── [email protected]
│   ├─┬ [email protected]
│   │ └─┬ [email protected]
│   │   └── [email protected]
│   └── [email protected]
└─┬ [email protected]
  └── [email protected]

Output of cat package.json:

的输出cat package.json

$ cat package.json 
{
  "name": "prepscholar",
  "version": "0.0.0",
  "devDependencies": {
    "grunt": "~0.4.1",
    "grunt-contrib-jshint": "~0.6.4",
    "grunt-dustjs": "~1.1.1",
    "grunt-contrib-watch": "~0.5.3",
    "grunt-contrib-compass": "~0.5.0"
  }
}

Output of cat Gruntfile.js:

的输出cat Gruntfile.js

$ cat Gruntfile.js 

module.exports = function(grunt) {

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    jshint: {
      files: ['Gruntfile.js', 'app/js/**/*.js', '!app/js/lib/**/*.js']
    },
    dustjs: {
      compile: {
        src: ['app/templates/**/*.html'],
        dest: 'app/js/templates.js'
      }
    },
    compass: {
      dev: {
        options: {
          sassDir: 'app/sass',
          cssDir: 'app/css',
          imagesDir: 'app/img',
          fontsDir: 'app/fonts',
          javascriptsDir: 'app/js/app',
          outputStyle: 'compressed'
        }
      }
    },
    watch: {
      gruntfile: {
        files: 'Gruntfile.js',
        tasks: ['compile']
      },
      css: {
        files: 'app/sass/**/*.scss',
        tasks: ['compass:dev']
      },
      livereload: {
        options: { livereload: true },
        files: ['app/css/**/*']
      },
      dust: {
        files: 'app/templates/**/*.html',
        tasks: ['dustjs']
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-contrib-compass');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-dustjs');
  grunt.loadNpmTasks('underscore');

  grunt.registerTask('default', ['compile', 'watch']);
  grunt.registerTask('compile', ['dust', 'compass']);
  grunt.registerTask('dust', ['dustjs']);
  grunt.registerTask('lint', ['jshint']);
};

采纳答案by crabcz

As was written in https://github.com/gruntjs/grunt/issues/888distin your .gitignore

正如在您的 .gitignore中的https://github.com/gruntjs/grunt/issues/888dist中所写

Hope that helps

希望有帮助

回答by beeryardtech

Found that this worked, as per https://github.com/gruntjs/grunt/issues/888

发现这有效,根据https://github.com/gruntjs/grunt/issues/888

rm -rf node_modules/grunt
npm install grunt

This should work too.

这也应该有效。

回答by Kahlil Lechelt

Try reinstalling your node modules.

尝试重新安装节点模块。

  1. Delete the node_modules folder
  2. Do npm cache clean
  3. Do npm install
  1. 删除 node_modules 文件夹
  2. npm cache clean
  3. npm install

Hope it helps :)

希望能帮助到你 :)

回答by ksimons

That looks like one of your grunt modules is trying to use underscore.jsbut it's not installed. This should fix your problem:

看起来您的一个 grunt 模块正在尝试使用underscore.js但它没有安装。这应该可以解决您的问题:

npm install underscore

Or even better, add underscore as a development dependency in your package.json:

或者更好的是,在 package.json 中添加下划线作为开发依赖项:

{
  <your existing stuff here>
  "devDependencies": {
    "underscore": "~1.5.2"
  }
}