Grunt / Batch:如何在gruntfile.js目录下执行shell命令?

我知道这是一个常见的问题,但我所尝试的所有答案都不起作用。 奇怪的是,一个朋友在他的Windows上尝试了这个脚本,实际上得到了当前目录(包含gruntfile.js的目录)。 我试图看到的差异,但我也没有find任何。

module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), shell: { test: { command: 'dir' } } }); grunt.loadNpmTasks('grunt-shell'); }; 

这是我得到的:

 D:\Websites\AUB>grunt shell:test Running "shell:test" (shell) task Volume in drive D is Data Volume Serial Number is 6E7B-40AB Directory of D:\Websites 04/22/2015 04:53 PM <DIR> . 04/22/2015 04:53 PM <DIR> .. 04/20/2015 11:04 AM <DIR> .sublime 03/30/2015 12:52 PM <DIR> .template 04/24/2015 07:55 AM <DIR> AUB 

我试图使用这个post的技巧,但它没有工作(我留在网站目录):

 command: 'set WORKING_DIRECTORY=%cd% && dir' 

我也试图find一些有用的“获取目录包含当前执行的批处理脚本” ,但我不明白如何使用它,因为我得到的错误:

 command: 'cd %~dp0 && dir' 

它返回:

 D:\Websites\AUB>grunt shell:test Running "shell:test" (shell) task The system cannot find the path specified. Warning: Command failed: C:\WINDOWS\system32\cmd.exe /s /c "cd %~dp0 && dir" The system cannot find the path specified. Use --force to continue. Aborted due to warnings. 

作为一个侧面说明,我从Grunt(clean,copy,rename,uglify等)直接使用的任何其他软件包工作正常,grunt-exec具有相同的行为。

这听起来很奇怪,因为通常所有的插件都相对于你的Gruntfile工作:

http://gruntjs.com/api/grunt.file

注意:除非使用grunt.file.setBase或–base命令行选项更改当前工作目录,否则所有文件路径都与Gruntfile相关。

您可以手动检索当前的工作:

 var cwd process.cwd() // Or to get a file inside the cwd var pathOfGruntfile = require('path').resolve('./Gruntfile.js'); 

并在你的Gruntfile中使用它:

 module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), cwd: process.cwd(), shell: { test: { command: 'cd "<%= cwd %>";dir' } } }); grunt.loadNpmTasks('grunt-shell'); };