执行任务的节点模块 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"。但是,我的节点模块应该在它自己的目录中找到这个文件。
我的树节点模块:
- 任务应用
- node_modules
- g运行t
- 来源
- 任务-app.js
- Gruntfile.js
- package.json
- README.md
- ...
我的任务-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" 中的示例。
我目前正在尝试开发一个模块,允许节点从命令行执行 运行 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"。但是,我的节点模块应该在它自己的目录中找到这个文件。
我的树节点模块:
- 任务应用
- node_modules
- g运行t
- 来源
- 任务-app.js
- Gruntfile.js
- package.json
- README.md
- ...
我的任务-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" 中的示例。