2015-05-13 31 views
0

我目前正在嘗試開發一個模塊,它將允許節點從命令行運行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); 
}); 

回答

0

最後,我瞭解使用Grunt任務的邏輯。當你有一個需要使用grunt任務的Web項目應用程序時,它必須在當前目錄中有Gruntfile.js。

但是,就像我從我的「編輯2」中所說的那樣,我們可以用--- gruntfile選項指定Gruntfile.js。所以,這不是一個缺點,因爲Grunt工具可以在你的web項目應用程序的當前目錄中與Gruntfile.js一起工作。

對於每個任務grunt,我使用--gruntfile選項來指定Gruntfile.js的路徑作爲我的例子從「edit 2」。

0

你從哪裏跑grunt?

您的項目結構和grunt文件看起來不錯。也許嘗試幷包括一個基本任務:

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

我從我的節點模塊全局安裝運行grunt。 我忘了解釋,「grunt模塊」包含在我的節點模塊「task-app」的「node_modules」中。當您從正確的文件夾(與GruntFile.js相同的級別)運行grunt時, – PauloDev

+0

會執行此項工作嗎?我的猜測是,即使你的咕嚕聲是全球性的,它也不知道要運行哪個「咕嚕聲」。 c:\ myapp \ - > \ grunt – tribe84

+0

是的,當我從Gruntfile.js(節點模塊任務應用程序目錄)的文件夾運行grunt時,它是可行的。但是,我試圖從我的項目目錄運行grunt,它不起作用。 但是,我從我的項目目錄中安裝了本地grunt,並且有相同的消息:致命錯誤:無法找到Gruntfile。 唯一的解決方案是在項目目錄中有這個Gruntfile.js? – PauloDev

相關問題