grunt 出现一个奇怪的错误:Object Gruntfile.js 没有“扁平化”方法
Posted
技术标签:
【中文标题】grunt 出现一个奇怪的错误:Object Gruntfile.js 没有“扁平化”方法【英文标题】:Getting a strange error with grunt: Object Gruntfile.js has no method 'flatten' 【发布时间】:2013-10-08 10:18:20 【问题描述】:我在尝试运行 grunt 时遇到了这个奇怪的错误:TypeError: Object Gruntfile.js has no method 'flatten'
我是 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)
有问题的行/文件:
/*
* 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;
;
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
npm list
的输出:
$ npm list
prepscholar@0.0.0 /home/a/prep/main/web/client
├─┬ grunt@0.4.1
│ ├── async@0.1.22
│ ├── coffee-script@1.3.3
│ ├── colors@0.6.2
│ ├── dateformat@1.0.2-1.2.3
│ ├── eventemitter2@0.4.13
│ ├─┬ findup-sync@0.1.2
│ │ └── lodash@1.0.1
│ ├─┬ glob@3.1.21
│ │ ├── graceful-fs@1.2.3
│ │ └── inherits@1.0.0
│ ├── hooker@0.2.3
│ ├── iconv-lite@0.2.11
│ ├─┬ js-yaml@2.0.5
│ │ ├─┬ argparse@0.1.15
│ │ │ ├── underscore@1.4.4
│ │ │ └── underscore.string@2.3.3
│ │ └── esprima@1.0.4
│ ├── lodash@0.9.2
│ ├─┬ minimatch@0.2.12
│ │ ├── lru-cache@2.3.1
│ │ └── sigmund@1.0.0
│ ├─┬ nopt@1.0.10
│ │ └── abbrev@1.0.4
│ ├─┬ rimraf@2.0.3
│ │ └── graceful-fs@1.1.14
│ ├── underscore.string@2.2.1
│ └── which@1.0.5
├─┬ grunt-contrib-compass@0.5.0
│ ├── async@0.2.9
│ ├── dargs@0.1.0
│ └── tmp@0.0.21
├─┬ grunt-contrib-jshint@0.6.4
│ └─┬ jshint@2.1.10
│ ├─┬ cli@0.4.5
│ │ └─┬ glob@3.2.6
│ │ └── inherits@2.0.1
│ ├── console-browserify@0.1.6
│ ├─┬ minimatch@0.2.12
│ │ ├── lru-cache@2.3.1
│ │ └── sigmund@1.0.0
│ ├── shelljs@0.1.4
│ └── underscore@1.4.4
├─┬ grunt-contrib-watch@0.5.3
│ ├─┬ gaze@0.4.2
│ │ └─┬ globule@0.1.0
│ │ ├─┬ glob@3.1.21
│ │ │ ├── graceful-fs@1.2.3
│ │ │ └── inherits@1.0.0
│ │ ├── lodash@1.0.1
│ │ └─┬ minimatch@0.2.12
│ │ ├── lru-cache@2.3.1
│ │ └── sigmund@1.0.0
│ └─┬ tiny-lr@0.0.4
│ ├── debug@0.7.2
│ ├── faye-websocket@0.4.4
│ ├─┬ noptify@0.0.3
│ │ └─┬ nopt@2.0.0
│ │ └── abbrev@1.0.4
│ └── qs@0.5.6
└─┬ grunt-dustjs@1.1.1
└── dustjs-linkedin@2.0.3
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"
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']);
;
【问题讨论】:
能否请您发布该违规行的全部内容 (findup-sync.js:33) @ksimons 感谢您关注此内容。我已经发布了违规行+其他可能有用的信息 @ksimons 更多信息:gruntfile.js 和 package.json 你需要做:npm install lodash @ksimons 在npm install -g lodash
以 root 身份后仍然出现同样的错误
【参考方案1】:
发现这行得通,根据https://github.com/gruntjs/grunt/issues/888
rm -rf node_modules/grunt
npm install grunt
这应该也可以。
【讨论】:
谢谢 - 当所有其他答案都没有时,它对我有用。【参考方案2】:尝试重新安装您的节点模块。
-
删除 node_modules 文件夹
做
npm cache clean
做npm install
希望对你有帮助:)
【讨论】:
rm -rf node_modules && npm cache clean && npm i【参考方案3】:正如您的 .gitignore 中的 https://github.com/gruntjs/grunt/issues/888 dist
所写
希望有帮助
【讨论】:
澄清一下:不要只是把dist
放在你的.gitignore 中。放一些你需要的具体的东西。对我来说,是./dist/
【参考方案4】:
看起来您的某个 grunt 模块正在尝试使用 underscore.js,但尚未安装。这应该可以解决您的问题:
npm install underscore
或者更好的是,在你的 package.json 中添加下划线作为开发依赖项:
<your existing stuff here>
"devDependencies":
"underscore": "~1.5.2"
【讨论】:
它没有帮助,但无论如何 +1 尝试全局安装:npm install -g underscore 啊,我猜错了。试试:npm install lodash。 Lodash 是下划线的替代品。 我以 root 身份登录并安装了npm install -g lodash
(2.2.0),但它仍然无法正常工作。之后作为普通用户尝试npm install lodash
,但仍然是完全相同的问题。感谢您的持续建议。以上是关于grunt 出现一个奇怪的错误:Object Gruntfile.js 没有“扁平化”方法的主要内容,如果未能解决你的问题,请参考以下文章