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

Node module to execute tasks grunt : "Gruntfile.js" not find

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

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

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

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

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

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

我的树节点模块:

我的任务-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
     }]
   }
 }
});

我不明白为什么在 "Gruntfile.js" 文件中找不到 Node 模块。

是否要求在这个项目目录下有一个文件"Gruntfile.js"?还有其他解决方案吗?

我也想知道,工程目录下的文件"Gruntfile.js"是否可以读取文件"package.json"?这是为了允许用户配置此文件以更改源路径等。

编辑:

经过一些研究,我越来越接近我的问题的解决方案。要更改默认执行当前目录的 "Gruntfile.js",我们可以在命令行中使用 --g运行tfile 选项。

如源码所示 g运行t (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.

如何为任何 Windows 用户指定 "Gruntfile.js" 的路径(在我全局安装的节点模块中找到)?

这是一个例子:

C:\Users\username\projects\demo-app> 任务应用复制

在我的源代码中,我使用 --g运行tfile 选项执行 g运行t 任务:

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:

等待响应,我找到了一个临时解决方案来获取我的节点模块中的 "Gruntfiles.js"。但缺点是要在当前目录中本地安装所有 Node 模块依赖项和我的 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);
});

你从哪里运行咕噜?

您的项目结构和 grunt 文件看起来不错。也许尝试包括一个基本任务:

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

终于明白Grunt任务的使用逻辑了。当你有一个需要使用任务 grunt 的 web 项目应用程序时,它必须在当前目录中有 Gruntfile.js。

但是,就像我在 "edit 2" 中所说的那样,我们可以使用 ---gruntfile 选项指定 Gruntfile.js。所以,这不是一个缺点,因为 Grunt 工具在当前目录中使用 Gruntfile.js,其中有您的 Web 项目应用程序。

对于每个任务 grunt,我使用 --gruntfile 选项指定 Gruntfile.js 的路径作为我在 "edit 2" 中的示例。