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

时间:2015-04-24 06:20:00

标签: windows gruntjs dos grunt-shell

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

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

我尝试使用来自this post的技巧,但它没有用(我留在网站目录中):

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

我还尝试使用"Get directory containing the currently executed batch script"找到有用的内容,但由于出现错误,我不知道如何使用它:

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(清理,复制,重命名,uglify等)的任何其他包正常工作,grunt-exec具有相同的行为。

1 个答案:

答案 0 :(得分:3)

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

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

  

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

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

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');
};