【问题标题】:Define multiple tasks in VSCode在 VSCode 中定义多个任务
【发布时间】:2015-07-14 19:11:44
【问题描述】:

我已经看到可以在 VSCode 中定义任务。但我不确定如何在tasks.json 文件中定义多个任务。

【问题讨论】:

标签: visual-studio-code vscode-tasks


【解决方案1】:

以防万一它对某人有所帮助...... 如果您没有/想要 gulp/grunt/etc... 或额外的 shell 脚本来代理您的任务命令,“npm run”已经存在。

这适用于 webpack 和 mocha,如 "Build and Test" , Shift+Ctrl+B, Shift kbd>+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"
  },
  ...
}

【讨论】:

  • 不错的解决方案!因此,您在 npm 脚本标签中定义您的实际命令,然后从 tasks.json 调用 npm 脚本。我真的很想直接在 tasks.json 中定义任务。这似乎有点多余?
【解决方案2】:

试试这个

{
    "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"
        }
    ]
}

【讨论】:

  • 请提供更多信息?有什么错误?我从 VS Code 0.8.0 开始使用它,它工作正常。
  • 在工具输出上我看到了标准的 cmd.exe onrun 输出。像这样:Microsoft Windows [版本 10.0.10240] (c) Корпорация Майкрософт (Microsoft Corporation), 2015 г. Все права защищены。 //MS 俄文版权 C:\Users\roman>
  • @neftedollar 这仅适用于 Windows。如果您正在寻找可以在 Mac 上运行的东西,请将 "command":"cmd" 更改为 "command":"sh" 并将 "args":["/c"] 更改为 "args":["-c "].
  • @raiglstorfer 谢谢,它在我的 Windows PC 上不起作用。
【解决方案3】:

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

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

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

以上定义会产生如下命令:

myCommand myCommandArguments myTaskArguments myTask

任务名称myTask 始终位于最后。从 0.4 版开始,它可以用"suppressTaskName": true 省略。

【讨论】:

  • 哇,我不敢相信这个答案,但尝试了一下,它是真实的并且有效。我想在 VSCode 中执行“gulp --no-color vet --verbose”的任务,但为了让它工作,我将参数用作任务,将任务用作参数,如“gulp --no-color --verbose vet" 在 tasks.json 中,其中 vet 是我的任务, --verbose 是一个参数。当然,这会导致 args 相同的任务出现问题,因此该任务以其 args 命名并在 VSCode 任务运行选项中如此列出。
  • 但是如果我想用不同的命令执行不同的任务怎么办?例如,一个任务应该运行 node-sass 而另一个应该运行 tsc?
【解决方案4】:

我使用以下 tasks.json 文件来运行多个 TypeScript 构建方案。我在每个文件夹中放了一个 tsconfig.json 文件,这样我就可以单独调整每个文件夹的输出。只需确保您禁止显示任务名称,因为它会尝试将其放入命令字符串中。

{
    "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 是输入根目录。两个文件夹都引用 /typingd 文件夹和 /typings 文件夹中的类型声明。 TypeScript 在某种程度上仅限于在外部引用中使用相对路径,因此如果这些文件夹结构相似,它有助于简化事情。

哦,是的,如果您将它们标记为非构建并覆盖构建键以从列表中选择特定任务,则可以更轻松地有选择地启动它们,就像这样..

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

更新:如果你愿意,你总是可以完全无赖。可能有更好的方法来处理参数,但目前这对我在 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
    }
  ]
}

【讨论】:

  • 这是一个非常清楚的例子!这可能是 MS 打算使用 tasks.json 的方式(很遗憾他们自己没有解释这一点)。唯一的问题是:如果我有不同的命令行任务怎么办? (我需要一个 tsc 任务和一个 node-sass 任务)
  • 查看更新,了解运行多个独立命令的方法。
  • 我同意,当您想使用 tsc 和 node-sass 时,单个“构建命令”会很麻烦。必须安装和学习第三方构建工具(如 gulp)是令人沮丧的。不得不为不同的操作系统列出不同的命令处理器是令人沮丧的。
【解决方案5】:

我不知道这个问题的正确答案(也想知道),但我的丑陋解决方法以防万一它对任何人都有帮助。 我在 Windows 上,我最终为自己创建了一个简单的批处理脚本,其中可能包含简单

"%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}"],
        },
    ]
}

【讨论】:

  • 我终于搞定了。在过去 9 个月左右的某个时间里,VS Code 开始将 taskName 添加到任务的 arg 1 中。所以我的批处理文件变成:“%2”“%3”,而不是你拥有的。如果这保持一致,我可能会回来编辑此解决方案。
【解决方案6】:

您可以在任务属性中列出多个任务。比如:

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

【讨论】:

  • 不过,他们必须使用相同的命令。你只能改变参数。
  • 是的,Edward B. 出于某种原因,当前的每篇博客文章都假设您刚刚开始使用 VS Code,还没有任何任务:S。但是您必须在根节点上设置“suppressTaskName”:true,然后可以在子任务中设置“taskName”,以便使用不同的命令。请参阅带有 tscmocha 任务的 @Dan 示例。
【解决方案7】:

此功能是在Visual Studio Code v1.9 (January 2017) 中添加的。示例和文字来自release notes

{
  "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 文件看起来像[上述]。

【讨论】:

    【解决方案8】:

    这似乎是 v0.5.0 的 VSCode 错误

    所以我添加了这个答案来展示@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 启动。但是,为了让第一个任务接受 args,任务名称和 args 必须颠倒过来。

    从 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 时任务名称和 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
    

    【讨论】:

      【解决方案9】:

      February 2017 版本开始,您可以使用Terminal Runner 并通过设置依赖任务来组合多个任务。这有点奇怪,因为它会为每个任务打开一个单独的集成终端,您必须观察它以查看事情是否正常并记住关闭(它们“堆叠”),并且您不会收到“完成”通知,但它完成了工作。该功能是初步的,但很有希望。这是一个为 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"]
          }]
      }
      

      【讨论】:

        【解决方案10】:

        以下内容对我有用:

        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"
          }
        

        运行凉亭:来自 vscode 的 Ctrl + Shift + B 运行测试:来自 vscode 的 Ctrl + Shift + T

        【讨论】:

          【解决方案11】:

          这对我有用...

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

          我在 Windows 上并使用外部批处理文件来运行我的命令。它与上面 Jonathan 的回答类似,但我没有向它传递任何命令,这意味着我的“tasks.json”文件不同。

          随着时间的推移,我可能会改变这种方法(例如,我还没有开始使用 gulp),但目前这种方法对我来说非常有效。

          我正在使用把手用于 html 模板、babel,因此我可以使用 ES6 代码和代码 linter 来发现错误。最后,批处理文件使用我的起始页 (index.html) 启动浏览器

          这是我的批处理文件 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”来运行我的批处理文件。

          【讨论】:

            【解决方案12】:

            我有一个 Electron 应用程序,它需要编译更少的样式表,然后构建并启动程序。我使用了对我有用的@Ocean 的解决方案……没有其他方法。

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

            build-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"
                    }
                ]
            }
            

            【讨论】:

              【解决方案13】:

              感谢这个线程,我现在有了 c# / dnxcore50 构建和测试调试等在 osx 上的 vscode 工作:

              {
              "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 文件只是为了调试。我期待着一种用 dnx 进行调试的方法,尽管我已经有几个星期没有寻找了。

              【讨论】:

                猜你喜欢
                • 2017-09-04
                • 1970-01-01
                • 2015-12-30
                • 1970-01-01
                • 2019-06-29
                • 1970-01-01
                • 2021-07-26
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多