我目前正在嘗試開發一個模塊,它將允許節點從命令行運行Grunt任務。該節點模塊是全球安裝:節點模塊執行任務grunt:「Gruntfile.js」not found
C:\Users\pcharpin\AppData\Roaming\npm\node_modules\task-app
的目標是,使用「咕嚕」命令是對用戶透明。爲了更好地解釋我的做法,利用我的節點模塊的一個簡單的例子:
C:\Users\pcharpin\Desktop\demo-app> task-app copy
在這個例子中,我的模塊將源目錄複製到目標目錄。
不幸的是,當我運行Grunt任務時,我的節點模塊向我表明目錄「demo-app」中沒有文件「Gruntfile.js」。但是,這個文件應該由我的Node模塊在它自己的目錄中找到。
我的樹節點模塊:
- 任務應用
- node_modules
- 咕嚕
- SRC
- 任務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」的執行,我們可以在命令行中使用--gruntfile選項。
如在源代碼咕嚕指示(咕嚕/ LIB /咕嚕/ tasks.js):
//Get any local Gruntfile or tasks that might exist. Use --gruntfile override
//if specified, otherwise search the current directory or any parent.
如何指定Gruntfile的」路徑。JS」的任何Windows用戶(全球範圍內安裝了我的節點模塊中找到)
下面是一個例子:
C:\ Users \用戶名\工程\演示應用>任務的應用程序副本
在
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:
小彭我的源代碼,我--gruntfile選項執行繁重的任務,這樣的在一個響應中,我發現了一個臨時解決方案來獲取Node模塊中的「Gruntfiles.js」。但缺點是在當前目錄中本地安裝所有Node模塊依賴項和我的Node Module。
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模塊」包含在我的節點模塊「task-app」的「node_modules」中。當您從正確的文件夾(與GruntFile.js相同的級別)運行grunt時, – PauloDev
會執行此項工作嗎?我的猜測是,即使你的咕嚕聲是全球性的,它也不知道要運行哪個「咕嚕聲」。 c:\ myapp \ - > \ grunt – tribe84
是的,當我從Gruntfile.js(節點模塊任務應用程序目錄)的文件夾運行grunt時,它是可行的。但是,我試圖從我的項目目錄運行grunt,它不起作用。 但是,我從我的項目目錄中安裝了本地grunt,並且有相同的消息:致命錯誤:無法找到Gruntfile。 唯一的解決方案是在項目目錄中有這個Gruntfile.js? – PauloDev