在VSCode中定义多个任务

我已经看到,可以在VSCode中定义一个任务。 但我不知道如何在“tasks.json”文件中定义多个任务。

以防万一它有助于… …。 如果你没有/想要gulp / grunt / etc或者一个额外的shell脚本来代理你的任务命令,那么“npm run”已经存在了。

这是为webpack和摩卡在“构build和testing”,Shift + Ctrl + B,Shift + Ctrl + T

.vscode / tasks.json:

{ "name": "npmTask", //... "suppressTaskName": true, "command": "npm", "isShellCommand": true, "args": [ "run" ], "tasks": [ { //Build Task "taskName": "webpack", //Run On Shift+Ctrl+B "isBuildCommand": true, //Don't run when Shift+Ctrl+T "isTestCommand": false, // Show the output window if error any "showOutput": "silent", //Npm Task Name "args": [ "webpack" ], // use 2 regex: // 1st the file, then the problem "problemMatcher": { "owner": "webpack", "severity": "error", "fileLocation": "relative", "pattern": [ { "regexp": "ERROR in (.*)", "file": 1 }, { "regexp": "\\((\\d+),(\\d+)\\):(.*)", "line": 1, "column": 2, "message": 3 } ] } }, { //Test Task "taskName": "mocha", // Don't run on Shift+Ctrl+B "isBuildCommand": false, // Run on Shift+Ctrl+T "isTestCommand": true, "showOutput": "always", "args": [ "mocha" ] } ] } 

的package.json:

 { ... "scripts": { "webpack": "webpack", "mocha": "/usr/bin/mocha" }, ... } 

尝试这个

 { "version": "0.1.0", "command": "cmd", "isShellCommand": true, "args": ["/C"], "tasks": [ { "taskName": "install", "args": ["npm install"] }, { "taskName": "build", "args": ["gulp build"], "isBuildCommand": true, "problemMatcher": "$gulp-tsc" } ] } 

有助于我更好地理解这一点的是传递给命令的参数序列。 这对一些人来说可能是显而易见的,但在文档中并不清楚。

省略一些字段只关注正在发送的命令:

 { "command": "myCommand" "args": ["myCommandArguments"], "tasks" : [ { "taskName": "myTask", "args": ["myTaskArguments"], "suppressTaskName": false, } ] } 

上面的定义将导致下面的命令:

 myCommand myCommandArguments myTaskArguments myTask 

任务名称myTask总是最后一个。 从版本0.4开始,可以用"suppressTaskName": true省略"suppressTaskName": true

我使用以下tasks.json文件来运行多个TypeScript构buildscheme。 我在每个文件夹中放置了一个tsconfig.json文件,以便我可以单独调整每个文件夹的输出。 只要确保你压制任务名称,因为它试图把它放在命令string中。

 { "version": "0.1.0", "command": "tsc", "showOutput": "always", "isShellCommand": true, "args": [], "windows": { "command": "tsc", "showOutput": "always", "isShellCommand": true }, "tasks": [ { "taskName": "Build the examples", "suppressTaskName": true, "isBuildCommand": false, "args": ["-p", "./source/examples", "--outDir", "./script/examples"], "problemMatcher": "$tsc" }, { "taskName": "Build the solution", "suppressTaskName": true, "isBuildCommand": false, "args": ["-p", "./source/solution", "--outDir", "./script/solution"], "problemMatcher": "$tsc" } ] } 

这就是文件夹结构的样子,其中/ script是输出根目录,/ source是input根目录。 两个文件夹都在/ typingd文件夹和/ typings文件夹中引用types声明。 TypeScript有些局限于在外部引用中使用相对path,所以如果这些文件夹结构相似,它有助于简化事情。

TypeScript多生成文件夹结构

哦,是的,它使得它更容易启动它们,如果你把它们标记为非构build,并覆盖构build键从列表中select一个特定的任务,就像这样..

 // Place your key bindings in this file to overwrite the defaults [ { "key": "ctrl+shift+b", "command": "workbench.action.tasks.runTask" } ] 

更新 :如果你愿意,你总是可以完全stream氓。 可能有更好的方法来处理参数,但是这个在OSX下适用于我。

 { "version": "0.1.0", "isShellCommand": true, "linux": { "command": "sh", "args": ["-c"] }, "osx": { "command": "sh", "args": ["-c"] }, "windows": { "command": "powershell", "args": ["-Command"] }, "tasks": [ { "taskName": "build-models", "args": ["gulp build-models"], "suppressTaskName": true, "isBuildCommand": false, "isTestCommand": false }, { "taskName": "run tests", "args": ["mocha ${workspaceRoot}/test"], "suppressTaskName": true, "isBuildCommand": false, "isTestCommand": false } ] } 

我不知道正确的答案(也想知道),但我的丑陋的解决方法,以防万一它帮助任何人。 我在Windows上,我最终创build了一个简单的批处理脚本

 "%1" "%2" 

然后我的tasks.json看起来像

 { "version": "0.1.0", "command": "c:\\...\\mytasks.bat" "tasks" : [ { "taskName": "myFirstTask", "args": "c:\\...\\task1.exe", "${file}"], }, { "taskName": "mySecondTask", "args": "c:\\...\\task2.exe", "${file}"], }, ] } 

您可以在任务属性中列出多个任务。 就像是:

 "tasks": [ { "taskName": "build", ... }, { "taskName": "package", ... } ] 

这似乎是VS0.5.0 VSCode的Bug

所以我已经添加了这个答案,以显示以前由@hurelu解释的示例。 我的tasks.json:

 { "version": "0.1.0", "command": "gulp", "isShellCommand": true, "args": [ "--no-color" ], "tasks": [ { "taskName": "--verbose", "isBuildCommand": true, "showOutput": "always", "args": [ "vet" ], "problemMatcher": [ "$jshint", "$jshint-stylish" ] }, { "taskName": "vet", "isTestCommand": true, "showOutput": "always", "args": [], "problemMatcher": [ "$jshint", "$jshint-stylish" ] } ] } 

我的gulp.js:

 /// <reference path="typings/tsd.d.ts" /> var gulp = require('gulp'); var jshint = require('gulp-jshint'); var jscs = require('gulp-jscs'); var util = require('gulp-util'); var gulpprint = require('gulp-print'); var gulpif = require('gulp-if'); var args = require('yargs').argv; gulp.task('vet', function () { log('Analyzing source with JSHint and JSCS'); return gulp .src ([ './src/**/*.js', './*.js' ]) .pipe(gulpif(args.verbose, gulpprint())) .pipe(jscs()) .pipe(jshint()) .pipe(jshint.reporter('jshint-stylish', { verbose: true })) .pipe(jshint.reporter('fail')); }); gulp.task('hello-world', function () { console.log('This is our first Gulp task!'); }); //////////// function log(msg) { if (typeof (msg) === 'object') { for (var item in msg) { if (msg.hasOwnProperty(item)) { util.log(util.colors.blue(msg[item])); } } } else { util.log(util.colors.blue(msg)); } } 

注意第一个任务使用isBuildCommand,所以CTRL + SHFT + B启动,下一个任务是isTestCommand,所以CTRL + SHFT + T启动。 然而,为了得到接受参数的首要任务,任务名称和参数必须颠倒过来。

从VSCode 0.5.0开始,上面的工作,但不是:

 { "version": "0.1.0", "command": "gulp", "isShellCommand": true, "args": [ "--no-color" ], "tasks": [ { "taskName": "vet", "isBuildCommand": true, "showOutput": "always", "args": [ "--verbose" ], "problemMatcher": [ "$jshint", "$jshint-stylish" ] }, { "taskName": "vet", "isTestCommand": true, "showOutput": "always", "args": [], "problemMatcher": [ "$jshint", "$jshint-stylish" ] } ] } 

这是从task.json输出正确的任务和参数顺序:

 [10:59:29] Using gulpfile ~/Workspaces/Examples/Gulp/pluralsight-gulp/gulpfile.js [10:59:29] Task 'default' is not in your gulpfile [10:59:29] Please check the documentation for proper gulpfile formatting 

这里是tasks.json的正确输出,使用args时taskname和arg颠倒了:

 [11:02:44] Using gulpfile ~/Workspaces/Examples/Gulp/pluralsight-gulp/gulpfile.js [11:02:44] Starting 'vet'... [11:02:44] Analyzing source with JSHint and JSCS [gulp] src/server/app.js [gulp] src/client/app/app.module.js [gulp] src/client/test-helpers/bind-polyfill.js [gulp] src/client/test-helpers/mock-data.js [gulp] src/server/routes/index.js [gulp] src/client/app/core/config.js [gulp] src/client/app/core/constants.js [gulp] src/client/app/core/core.module.js [gulp] src/client/app/core/dataservice.js [gulp] src/client/app/core/dataservice.spec.js [gulp] src/client/app/customers/customer-detail.controller.js [gulp] src/client/app/customers/customer-detail.controller.spec.js [gulp] src/client/app/customers/customers.controller.js [gulp] src/client/app/customers/customers.controller.spec.js [gulp] src/client/app/customers/customers.module.js [gulp] src/client/app/customers/customers.route.js [gulp] src/client/app/customers/customers.route.spec.js [gulp] src/client/app/dashboard/dashboard.controller.js [gulp] src/client/app/dashboard/dashboard.controller.spec.js [gulp] src/client/app/dashboard/dashboard.module.js [gulp] src/client/app/dashboard/dashboard.route.js [gulp] src/client/app/dashboard/dashboard.route.spec.js [gulp] src/client/app/layout/ht-sidebar.directive.js [gulp] src/client/app/layout/ht-sidebar.directive.spec.js [gulp] src/client/app/layout/ht-top-nav.directive.js [gulp] src/client/app/layout/layout.module.js [gulp] src/client/app/layout/shell.controller.js [gulp] src/client/app/layout/shell.controller.spec.js [gulp] src/client/app/layout/sidebar.controller.js [gulp] src/client/app/layout/sidebar.controller.spec.js [gulp] src/client/app/widgets/ht-img-person.directive.js [gulp] src/client/app/widgets/ht-widget-header.directive.js [gulp] src/client/app/widgets/widgets.module.js [gulp] src/client/tests/server-integration/dataservice.spec.js [gulp] src/server/routes/utils/errorHandler.js [gulp] src/server/routes/utils/jsonfileservice.js [gulp] src/client/app/blocks/exception/exception-handler.provider.js [gulp] src/client/app/blocks/exception/exception-handler.provider.spec.js [gulp] src/client/app/blocks/exception/exception.js [gulp] src/client/app/blocks/exception/exception.module.js [gulp] src/client/app/blocks/logger/logger.js [gulp] src/client/app/blocks/logger/logger.module.js [gulp] src/client/app/blocks/router/router-helper.provider.js [gulp] src/client/app/blocks/router/router.module.js [gulp] gulpfile.js [gulp] karma.conf.js [11:02:48] Finished 'vet' after 4.37 s 

此function是在Visual Studio Code v1.9(2017年1月)中添加的 。 示例和文本来自发行说明 :

 { "version": "0.1.0", "tasks": [ { "taskName": "tsc", "command": "tsc", "args": ["-w"], "isShellCommand": true, "isBackground": true, "problemMatcher": "$tsc-watch" }, { "taskName": "build", "command": "gulp", "args": ["build"], "isShellCommand": true } ] } 

每个任务的命令

您现在可以为每个任务定义不同的命令( #981 )。 这允许为不同的任务运行不同的命令,而无需编写自己的shell脚本。 每个任务使用命令的tasks.json文件看起来像[上面]。

以下为我工作:

tasks.json:

 { "version": "0.1.0", "command": "cmd", "isShellCommand": true, "args": [ "/c" ], "tasks": [ { "taskName": "bower", "args" : ["gulp bower"], "isBuildCommand": true, "showOutput": "always" }, { "taskName": "unittest", "suppressTaskName": true, "args" : ["dnx -p ${cwd}\\test\\MyProject.UnitTests test"], "isTestCommand": true, "showOutput": "always" } ] } 

MyProject.UnitTests \ project.json

  "commands": { "test": "xunit.runner.dnx" } 

运行bower:vscode的Ctrl + Shift + B运行testing:从vscode的Ctrl + Shift + T.

这适用于我…

我知道这里有很多不同的答案,但是我的方法又有一点不同,所以我想我会增加2便士的价值。

我在Windows上,并使用外部batch file来运行我的命令。 这与乔纳森的答案类似,但我不pipe任何命令,这意味着我的“tasks.json”文件是不同的。

我可能会随着时间的推移改变这种方法(例如,我还没有到处喝酒),但目前这种方法对我来说工作得非常好。

我使用的HTML模板,babel的句柄,所以我可以使用ES6代码和代码linter来拾取错误。 最后,batch file将启动一个浏览器,其中包含我的起始页面(index.html)

这是我的batch file名为run_tasks.bat:

 @ECHO OFF @ECHO Startz! @ECHO Running Handlebars! call handlebars html_templates -e html -f dist/html_templates.js @ECHO Linting ES6 code call eslint -c eslint.json src @ECHO Running Babel ES6 to ES5 call babel src --out-dir dist --source-maps @ECHO Now startzing page up in browser! index.html @ECHO Donezz it! 

这里是我的tasks.json文件:

 { "version": "0.1.0", "command": "${workspaceRoot}/run_tasks.bat", "isShellCommand": true, "isWatching": true, "showOutput": "always", "args": [], "tasks": [ { "taskName": "build", "isBuildCommand": true, "isWatching": true, "showOutput": "always" } } 

然后,在VSCode我按“CTRL + SHIFT + B”来运行我的batch file。

我有一个电子应用程序,需要编译一个较less的样式表,然后构build和启动程序。 我用@ Ocean的解决scheme,为我工作…没有别的工作。

我的tasks.json和build-tasks.bat文件都位于项目根目录下的.vscode目录中。

集结tasks.bat

 @ECHO OFF @ECHO Begin! @ECHO Compiling Less call lessc ./css/styles.less ./css/styles.css @ECHO Build Electron App and Launch call electron ./app.js @ECHO Finished! 

tasks.json

 { "version": "0.1.0", "command": "${workspaceRoot}\\.vscode\\build-tasks.bat", "isShellCommand": true, "isWatching": true, "showOutput": "always", "args": [], "tasks": [ { "taskName": "build", "isBuildCommand": true, "isWatching": true, "showOutput": "always" } ] } 

从2017年2月发行版开始,您可以使用Terminal Runner并通过设置依赖关系任务来撰写多个任务。 这有点儿奇怪,它会为每个任务打开一个单独的集成terminal,你必须注意看看事情是否奏效,记住要closures(他们“堆栈”),而你没有得到“完成”通知,但它完成了工作。 function是初步的,但它是有前途的。 下面是一个为Cordova应用程序运行tsc和jspm的例子。

 { // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [{ "taskName": "tsc", "command": "tsc", "isShellCommand": true, "args": ["-p", "."], "showOutput": "always", "problemMatcher": "$tsc" }, { "taskName": "jspm", "command": "jspm", "isShellCommand": true, "args": ["bundle-sfx", "www/app/main.js", "www/dist/bundle.js", "--inline-source-maps", "--source-map-contents"], "showOutput": "always" }, { "taskName": "build", "isBuildCommand": true, "dependsOn": ["tsc", "jspm"] }] } 

感谢这个线程,我现在已经在osx上的vscode中用c#/ dnxcore50编译和testingdebugging工作,

 { "version": "0.1.0", "command": "bash", "args": [ ], "tasks": [ { "taskName": "xbuild", "args": [ "./src/Service.Host/Service.Host.csproj" ], "showOutput": "always", "problemMatcher": "$msCompile", "isBuildCommand": true }, { "taskName": "dnx", "args" : ["-p", "./test/Service.Tests.Unit", "test"], "isTestCommand": true, "showOutput": "always" } ] } 

我相信Linux将是基本相同的。 唯一让我讨厌的是不得不维护.csproj文件来进行debugging。 我期待用dnx进行debugging的方法,虽然我现在还没有找几个星期。

我已经修改了@Jason的回答,以消除弃用警告 – 未来certificate自己!

 { // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "taskName": "tsc", "command": "tsc", "type": "shell", "args": ["-p", "."], "problemMatcher": "$tsc", "presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "shared" } }, { "taskName": "jspm", "command": "jspm", "type": "shell", "args": ["bundle-sfx", "www/app/main.js", "www/dist/bundle.js", "--inline-source-maps", "--source-map-contents"], "presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "shared" } }, { "taskName": "build", "dependsOn": ["tsc", "jspm"], "group": { "kind": "build", "isDefault": true } } ] }