【问题标题】:How to run multiple tasks in VS Code on build?如何在构建时在 VS Code 中运行多个任务?
【发布时间】:2019-02-13 17:31:20
【问题描述】:

使用tasks.json 2.0.0 版,我无法做到这样,当我构建我的应用程序时,多个任务会同时运行。我正在使用 gulp 进行 SCSS 编译,并且自己运行我的 Compile/minify cms.scss 任务可以正常工作,因此任务本身没有问题,只是 VS Code 的任务运行器。当我在 VS Code 中 Run Build Task 时,我的 gulp 任务没有运行,即使它有 "group": "build" — 只有 dotnet 一个。

tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "command": "dotnet",
            "type": "process",
            "args": [
                "build",
                "${workspaceFolder}/HpsCoreWeb.csproj"
            ],
            "problemMatcher": "$msCompile",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "Compile/minify cms.scss",
            "type": "gulp",
            "task": "cms.scss:cms.min.css",
            "problemMatcher": "$node-sass",
            "group": "build"
        }
    ]
}

根据VS Code Tasks documentation

:定义任务所属的组。在示例中,它属于test 组。可以通过从 Command Palette 运行 Run Test Task 来执行属于测试组的任务。

dotnet build 任务正在成功,所以不应该运行同样属于build 组的其他任务吗?我做错了什么?

【问题讨论】:

    标签: visual-studio-code vscode-tasks


    【解决方案1】:

    问题在于“运行测试任务”和“运行构建任务”不会执行该特定组中的所有任务。通常你会得到一个下拉选择,这样你就可以选择要执行的任务。由于您已将其中一项任务指定为默认任务,因此将跳过选择并执行默认任务。

    您可以通过添加依赖项来解决这个问题。举个例子:

    {
        "version": "2.0.0",
        "tasks": [
            {
                "label": "Echo 1",
                "command": "echo",
                "type": "shell",
                "args": [ "echo1" ],
                "group": {
                    "kind": "build",
                    "isDefault": true
                },
                "dependsOn":["Echo 2"]
            },
            {
                "label": "Echo 2",
                "type": "shell",
                "command": "echo",
                "args": [ "echo2" ],
                "group": "build"
            }
        ]
    }
    

    由于Echo 1 依赖于Echo 2Echo 2 将在执行Echo 1 之前执行。请注意,定义是一个列表,因此可以指定多个任务。在这种情况下,任务是并行执行的。

    在您的情况下,将 "dependsOn":["Compile/minify cms.scss"] 添加到您的主要构建任务应该会执行这两个任务。

    【讨论】:

    • 我的真实项目实际上还有很多 gulp 任务。这是否意味着我必须基本上将它们“菊花链”在一起(dotnet build 取决于gulp1,这取决于gulp2 等)只是为了让它们全部运行?如果它有效,它就有效,但令人震惊的是,他们并没有简单地异步执行定义组中的所有任务而不定义错误依赖项的方法。
    • @JacobStamm 不是你的问题的答案,但如果你已经在使用 gulp,那么在那里对你的任务进行分组应该很简单。事实上,我希望 gulp 的 default 包含对这些任务的引用。
    • @jacob-stamm 无需菊花链,您可以将它们全部作为依赖项添加到一项任务中。我很确定它们仍然不会并行运行。另一种解决方案是编写一个批处理文件/shellscript 并调用它。截至目前(v1.27.2),我不知道从 VS 代码中执行此操作的更好方法。如果它很困扰您,您还可以在 github 上提交功能请求。开发人员通常反应非常快。
    • @G.G,所以dotnet build 任务的dependsOn 将是["gulp1", "gulp2"] 等。我相信可以解决它:) 异步性会很好,但这确实满足了我的问题。我很可能会在 VS Code 的 repo 中针对此功能提交一个 GitHub 问题。
    • 我已经确认在dependsOndoes execute them asynchronously中列出多个任务
    【解决方案2】:

    您可以使用Compound Tasks

    以下示例在调用“Build”任务时执行“Client Build”和“Server Build”任务。

    {
      "version": "2.0.0",
      "tasks": [
        {
          "label": "Client Build",
          "command": "gulp",
          "args": ["build"],
          "options": {
            "cwd": "${workspaceFolder}/client"
          }
        },
        {
          "label": "Server Build",
          "command": "gulp",
          "args": ["build"],
          "options": {
            "cwd": "${workspaceFolder}/server"
          }
        },
        {
          "label": "Build",
          "dependsOn": ["Client Build", "Server Build"]
        }
      ]
    }
    

    【讨论】:

      【解决方案3】:

      仔细检查您的设置是否启用了 Gulp 自动检测:

      "gulp.autoDetect": "on"
      

      【讨论】:

      • 碰巧我的示例使用了 gulp,其自动检测将消除在构建时重新运行 gulp 任务的需要。但我的问题更多是关于如何在构建中运行多个任务,无论它们是什么类型的任务。
      【解决方案4】:

      package.json中添加“gulp-load-plugins”插件

      var gulpLoadPlugins = require('gulp-load-plugins'),
      plugins = gulpLoadPlugins();
      

      要了解有关该插件的更多信息,请参阅How To Build And Develop Websites With Gulp

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-04
        • 1970-01-01
        相关资源
        最近更新 更多