节点模块执行任务grunt:" Gruntfile.js"没找到

时间:2015-05-13 17:34:29

标签: javascript node.js command-line gruntjs

我目前正在尝试开发一个模块,允许节点从命令行运行Grunt任务。此节点模块全局安装:

C:\Users\pcharpin\AppData\Roaming\npm\node_modules\task-app

目标是使用" Grunt"命令对用户是透明的。为了更好地解释我的方法,一个使用我的节点模块的简单例子:

C:\Users\pcharpin\Desktop\demo-app> task-app copy

在此示例中,我的模块将源目录复制到目标目录。

不幸的是,当我运行任务Grunt时,我的节点模块向我指示没有文件" Gruntfile.js"在目录" demo-app"中。但是,我的Node模块应该在它自己的目录中找到这个文件。

我的树节点模块:

  • 任务应用
  • node_modules
    • 咕噜
  • SRC
    • 任务app.js
  • Gruntfile.js
  • 的package.json
  • README.md
  • ...

我的task-app.js文件,这里是代码:

#!/Usr/bin/env node

var grunt = require('grunt');

var args = process.argv.splice(2)

checkArguments(args);

checkArguments function(args) {
    [...]
    runCopy();
}

runCopy = function() {
   var spawn = require('child_process') spawn.
   var exec = spawn('cmd', ['/ c', 'grunt copy']);
   exec.stdout.on("data", function (data) {
     console.log('' + data);
   });
   exec.stderr.on('data', function (data) {
     console.log('' + data);
   });
}

然后在我的" Gruntfile.js"文件,我有代码来执行源到目标目录的副本:

module.exports = function(grunt) {

   grunt.loadNpmTasks('grunt-contrib-copy');

   grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    copy {
     srcWeb {
      files: [{
        cwd: '<%= pkg.srcWeb%>', //root to copy
        src: '**/*', // copy all files and subfolders
        dest: '<%= pkg.name%>/www/', // destination folder
        expand: true // When required using cwd
     }]
   }
 }
});

我不明白为什么在&#34; Gruntfile.js&#34;中没有找到Node模块。文件。

是否需要一个文件&#34; Gruntfile.js&#34;在这个项目目录中?还有其他解决方案吗?

我也想知道,文件是否可能&#34; Gruntfile.js&#34;可以读取文件&#34; package.json&#34;在项目目录中?这是为了允许用户配置此文件以更改源路径,例如。

编辑:

经过一些研究,我越来越接近我的问题的解决方案。要改变&#34; Gruntfile.js&#34;的执行默认情况下,这是当前目录,我们可以在命令行中使用--gruntfile选项。

如源代码grunt(grunt / lib / grunt / tasks.js)中所示:

//Get any local Gruntfile or tasks that might exist. Use --gruntfile   override
//if specified, otherwise search the current directory or any parent.

如何指定&#34; Gruntfile.js&#34;的路径? (对于任何Windows用户,在我的全局安装的节点模块中找到)?

以下是一个例子:

C:\ Users \用户名\项目\演示应用&GT;任务 - 应用副本

在我的源代码中,我使用--gruntfile选项执行这样的grunt任务:

runCopy = function() {
  var spawn = require('child_process').spawn;
  var pathGruntfile = 'C:\Users\username\AppData\Roaming\npm\node_module\task-app';
  var exec = spawn('cmd', ['/ c', 'grunt --gruntfile' + pathGruntfile + ' Gruntfile.js']);
  exec.stdout.on("data", function (data) {
    console.log('' + data);
  });
  exec.stderr.on('data', function (data) {
    console.log('' + data);
 });
}

编辑2:

在回复之前,我找到了一个临时解决方案来获取&#34; Gruntfiles.js&#34;在我的Node模块中。但缺点是在当前目录中本地安装所有节点模块依赖项和我的节点模块。

var pathDirCurrent = process.cwd();
var pathGruntfile = pathDirCurrent.concat('\\node_modules\\task-app\\Gruntfile.js');    
var spawn = require('child_process').spawn;
var exec = spawn('cmd', ['/c', 'grunt --gruntfile ' + pathGruntfile + ' create']);
exec.stdout.on("data", function(data) {
    console.log('' + data);
});

2 个答案:

答案 0 :(得分:0)

你从哪里跑出咕噜声?

您的项目结构和grunt文件看起来没问题。也许尝试包含一个基本任务:

 grunt.registerTask('default', ['copy']);

答案 1 :(得分:0)

最后,我理解使用Grunt任务的逻辑。当您有一个需要使用任务grunt的Web项目应用程序时,它必须在当前目录中具有Gruntfile.js。

但是,正如我在编辑2&#34;中所说,我们可以使用--- gruntfile选项指定Gruntfile.js。因此,它不是一个缺点,因为Grunt工具可以与当前目录中的Gruntfile.js一起使用,其中有您的Web项目应用程序。

对于每个任务grunt,我使用--gruntfile选项指定Gruntfile.js的路径作为我的示例来自&#34;编辑2&#34;。