Grunt/Batch : 如何在 gruntfile.js 目录中执行 shell 命令?
Grunt/Batch : how to execute shell commands within the gruntfile.js directory?
我知道这是一个常见问题,但我尝试过的所有答案均无效。奇怪的是,一位朋友在他的 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'
其中 returns :
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 具有相同的行为。
这听起来很奇怪,因为通常所有插件都与您的 Gruntfile 相关:
http://gruntjs.com/api/grunt.file
Note: all file paths are relative to the Gruntfile unless the current
working directory is changed with grunt.file.setBase or the --base
command-line option.
您可以手动检索当前工作:
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');
};
我知道这是一个常见问题,但我尝试过的所有答案均无效。奇怪的是,一位朋友在他的 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'
其中 returns :
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 具有相同的行为。
这听起来很奇怪,因为通常所有插件都与您的 Gruntfile 相关:
http://gruntjs.com/api/grunt.file
Note: all file paths are relative to the Gruntfile unless the current working directory is changed with grunt.file.setBase or the --base command-line option.
您可以手动检索当前工作:
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');
};