Fatal error: Unable to find Gruntfile-Collection of common programming errors
grunt –version
grunt-cli v0.1.8
grunt v0.4.1
$ npm -v
1.2.18
$ node -v
v0.10.6
and when i do grunt init, to create the Gruntfile.js i get error:
$ grunt init
A valid Gruntfile could not be found. Please see the getting started guide for
more information on how to configure grunt: http://gruntjs.com/getting-started
Fatal error: Unable to find Gruntfile.
I have searched for Grunfile.js, i get:
/home/ka/.npm/grunt-cli/0.1.8/package/Gruntfile.js
/home/ka/tmp/npm-1464/1368671910572-0.38816986070014536/package/Gruntfile.js
/usr/local/lib/node_modules/grunt/Gruntfile.js
/usr/local/lib/node_modules/grunt/node_modules/findup-sync/Gruntfile.js
/usr/local/lib/node_modules/grunt-cli/Gruntfile.js
/usr/local/lib/node_modules/grunt-cli/node_modules/findup-sync/Gruntfile.js
/ex/co/www/dev/htdocs/unittest/node_modules/grunt/node_modules/findup-sync/Gruntfile.js
/ex/co/www/dev/htdocs/unittest/node_modules/grunt/Gruntfile.js
/root/.npm/findup-sync/0.1.2/package/Gruntfile.js
/root/.npm/grunt/0.4.1/package/Gruntfile.js
/root/.npm/grunt-cli/0.1.8/package/Gruntfile.js
Can i just copy one of these grunt files, to /ex/co/www/dev/htdocs/unittest ( where the javascipt / quint test are ) ? or is there something else i am missing
i am trying to run grunt on Centos 6.4
and why does’nt grunt init creates the Gruntfile.js ?
cp /root/.npm/grunt/0.4.1/package/Gruntfile.js /ex/co/www/dev/htdocs/unittest/
ok copied it AS-IS and now getting better errors:
grunt
>> Local Npm module "grunt-contrib-jshint" not found. Is it installed?
>> Local Npm module "grunt-contrib-nodeunit" not found. Is it installed?
>> Local Npm module "grunt-contrib-watch" not found. Is it installed?
Warning: Task "jshint" not found. Use --force to continue.
Aborted due to warnings.
mode progress….
grunt
Running "jshint:gruntfile" (jshint) task
Warning: Cannot call method 'forEach' of undefined Use --force to continue.
Aborted due to warnings.
kahmed@vm-devqa01 /ex/co/www/dev/htdocs/unittest $ grunt --force
Running "jshint:gruntfile" (jshint) task
Warning: Cannot call method 'forEach' of undefined Used --force, continuing.
Warning: Cannot call method 'forEach' of undefined Used --force, continuing.
Running "jshint:libs_n_tests" (jshint) task
Warning: Cannot call method 'forEach' of undefined Used --force, continuing.
Warning: Cannot call method 'forEach' of undefined Used --force, continuing.
Running "jshint:subgrunt" (jshint) task
Warning: Cannot call method 'forEach' of undefined Used --force, continuing.
Warning: Cannot call method 'forEach' of undefined Used --force, continuing.
Running "nodeunit:all" (nodeunit) task
Warning: Cannot call method 'map' of undefined Used --force, continuing.
Warning: Cannot call method 'map' of undefined Used --force, continuing.
Running "subgrunt:all" (subgrunt) task
Warning: Cannot read property 'length' of undefined Used --force, continuing.
Warning: Cannot read property 'length' of undefined Used --force, continuing.
Done, but with warnings.
My Gruntfile.js:
/*
* grunt
* http://gruntjs.com/
*
* Copyright (c) 2013 "Cowboy" Ben Alman
* Licensed under the MIT license.
* https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
*/
'use strict';
module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
nodeunit: {
all: ['test/{grunt,tasks,util}/**/*.js']
},
jshint: {
gruntfile: ['Gruntfile.js'],
libs_n_tests: ['lib/**/*.js', ''],
subgrunt: [''],
options: {
curly: true,
eqeqeq: true,
immed: true,
latedef: true,
newcap: true,
noarg: true,
sub: true,
undef: true,
unused: true,
boss: true,
eqnull: true,
node: true,
es5: true
}
},
watch: {
gruntfile: {
files: [''],
tasks: ['jshint:gruntfile']
},
libs_n_tests: {
files: [''],
tasks: ['jshint:libs_n_tests', 'nodeunit']
},
subgrunt: {
files: [''],
tasks: ['jshint:subgrunt', 'subgrunt']
}
},
subgrunt: {
all: ['test/gruntfile/*.js']
},
});
// These plugins provide necessary tasks.
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-nodeunit');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.registerTask('test', 'qunit:src');
// "npm test" runs these tasks
grunt.registerTask('test', ['jshint', 'nodeunit', 'subgrunt']);
// Default task.
grunt.registerTask('default', ['test']);
// Run sub-grunt files, because right now, testing tasks is a pain.
grunt.registerMultiTask('subgrunt', 'Run a sub-gruntfile.', function() {
var path = require('path');
grunt.util.async.forEachSeries(this.filesSrc, function(gruntfile, next) {
grunt.util.spawn({
grunt: true,
args: ['--gruntfile', path.resolve(gruntfile)],
}, function(error, result) {
if (error) {
grunt.log.error(result.stdout).writeln();
next(new Error('Error running sub-gruntfile "' + gruntfile + '".'));
} else {
grunt.verbose.ok(result.stdout);
next();
}
});
}, this.async());
});
};
-
I think what you’re looking for is the actual command line tool
grunt-init
found in the Project Scaffolding documentation.Your current command
grunt init
is looking for aGruntfile.js
and the taskinit
inside it. It is obviously unable to find yourGruntfile.js
so is throwing that error.Edit:
Your new error is because you have copied a
Gruntfile.js
file over and thedefault
task (found near the bottom if you want to open it) will be calling those modules. Normally you will have used something likebower
to install them into your local directory.Your default task I referred to above will look something like this:
grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);
This is basically saying: when I run
grunt
at the command line, run the tasksjshint
,qunit
,concat
anduglify
in that order. These tasks will have been specified earlier on in theGruntfile
. To understand the file more check out a sample Gruntfile.May I suggest taking a look at the Yeoman as it is a great tool to provide you with scaffolding for your apps (including a working
Gruntfile.js
).Edit 2:
It is important you understand what is happening. The
Gruntfile.js
you have copied over looks to be calling “subgrunt” tasks. i.e.grunt
tasks in sub projects. Is this what you are wanting?Following through your
Gruntfile.js
– when you rungrunt
it is calling the following order:'jshint', 'nodeunit', 'subgrunt'
.Ideally you want to write this yourself rather than copying it as there are some options being called by
jshint
I am unfamiliar with. If you read the jshint documentation it doesn’t mention the first three options.I think you should try something like this:
jshint: { options: { curly: true, eqeqeq: true, immed: true, latedef: true, newcap: true, noarg: true, sub: true, undef: true, unused: true, boss: true, eqnull: true, node: true, es5: true } files: { src: ['path/to/your/*.js', 'another/path/to/your/*.js'] } }
You should read through the documentation for each task and make sure you understand the options you are passing through.
Another hint. If you see a file reference like the following:
This is a reference to a particular file/property set in the
Gruntfile.js
. In this case, this came from thewatch
task and points to thejshint.gruntfile
property as a file to watch.