web-dev-qa-db-fra.com

Erreur fatale: impossible de trouver le fichier Gruntfile

grunt --version

grunt-cli v0.1.8
grunt v0.4.1

$ npm -v

1.2.18

$ node -v

v0.10.6

Quand je lance grunt init pour créer le Gruntfile.js, j'obtiens une erreur:

$ 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.

J'ai cherché Grunfile.js, et je reçois:

/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

Puis-je simplement copier l'un de ces fichiers grunt, vers/ex/co/www/dev/htdocs/unittest (où se trouvent le test Javascript/quint)? Ou y a-t-il autre chose qui me manque?

J'essaie de grogner sur Centos 6.4. Aussi, pourquoi grunt init ne crée-t-il pas le Gruntfile.js?

cp /root/.npm/grunt/0.4.1/package/Gruntfile.js /ex/co/www/dev/htdocs/unittest/

Je l'ai copié tel quel et maintenant j'ai de meilleures erreurs:

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 progrès ....

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.

Mon 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', '<%= nodeunit.all %>'],
      subgrunt: ['<%= subgrunt.all %>'],
      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: ['<%= jshint.gruntfile %>'],
        tasks: ['jshint:gruntfile']
      },
      libs_n_tests: {
        files: ['<%= jshint.libs_n_tests %>'],
        tasks: ['jshint:libs_n_tests', 'nodeunit']
      },
      subgrunt: {
        files: ['<%= subgrunt.all %>'],
        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());
  });

};
11
kamal

Je pense que ce que vous recherchez, c’est l’outil en ligne de commande grunt-init que l’on trouve dans la documentation Project Scaffolding .

Votre commande actuelle grunt init recherche un Gruntfile.js et la tâche init qu'il contient. Il est évidemment impossible de trouver votre Gruntfile.js, donc cette erreur est renvoyée.

Modifier:

Votre nouvelle erreur est due au fait que vous avez copié un fichier Gruntfile.js et que la tâche default (située près du bas si vous voulez l'ouvrir) appellera ces modules. Normalement, vous aurez utilisé quelque chose comme bower pour les installer dans votre répertoire local.

Votre tâche par défaut à laquelle j'ai fait référence ci-dessus ressemblera à ceci:

grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);

En gros, lorsque je lance grunt sur la ligne de commande, exécutez les tâches jshint, qunit, concat et uglify dans cet ordre. Ces tâches auront déjà été spécifiées dans la variable Gruntfile. Pour mieux comprendre le fichier, jetez un sample Gruntfile .

Puis-je suggérer de jeter un coup d'œil au Yeoman , car il s'agit d'un excellent outil pour vous fournir un échafaudage pour vos applications (y compris un Gruntfile.js en état de marche).

Edit 2:

Il est important que vous compreniez ce qui se passe. Le Gruntfile.js que vous avez copié semble appeler des tâches "sous-groupe". grunt tâches dans les sous-projets. Est-ce ce que vous voulez?

En suivant votre Gruntfile.js - lorsque vous exécutez grunt, il appelle la commande suivante: 'jshint', 'nodeunit', 'subgrunt'.

Idéalement, vous voulez écrire ceci vous-même plutôt que de le copier car il existe des options appelées par jshint avec lesquelles je ne suis pas familier. Si vous lisez la documentation jshint , les trois premières options ne sont pas mentionnées.

Je pense que vous devriez essayer quelque chose comme ça:

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']
  }
}

Vous devriez lire la documentation de chaque tâche et vous assurer de bien comprendre les options que vous passez. 

Un autre indice. Si vous voyez une référence de fichier comme celle-ci:

 <%= jshint.gruntfile %>

Ceci est une référence à un fichier/propriété particulier défini dans le Gruntfile.js. Dans ce cas, cela provenait de la tâche watch et désignait la propriété jshint.gruntfile en tant que fichier à surveiller. 

12
Ewan

J'ai eu cette même erreur, et il s'est avéré qu'il me fallait d'abord lancer l'installation de npm. Même si j’avais déjà installé npm précédemment, quelque chose s’était corrompu avec l’installation. Une réinstallation rapide a fonctionné; Tout ce dont j'avais besoin était ces deux commandes:

npm install
grunt jshint
13
WEFX

J'ai eu un problème similaire, j'ai utilisé les commandes ci-dessous et cela a fonctionné pour moi

grunt -f 
grunt server

J'espère que cela fonctionne pour vous aussi. 

0
darhamid