visual-studio-codevscode-tasks

VSCode: Open new terminal as part of task?


Visual Studio Code was just updated to allow running a task and having them open in a split terminal. This is great, however I'm looking for one more thing to make this perfect.

I would like to be able to open a total of 3 terminals via a task. One for my NPM build, one for my backend MAVEN build, and a third that is just a blank new terminal I can use for git commands when needed.

I can't seem to find a way to tell VSC to run a task that just opens a new terminal ready to use without providing it a command. I would even settle with giving it a simple command like "node -v" just to start it out, as long as that panel is still usable after. Right now it wants to close it after it has ran.

Here is my task setup: I have one task setup as the build task that depends on two others. I envision adding a third one to that which would just open the new terminal:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Run Maven and NPM",
      "dependsOn": [ "maven", "npm" ],
      "group": {
        "kind": "build",
        "isDefault": true,
      },
    },
    {
      "label": "maven",
      "command": "...",
      "type": "shell",
      "presentation": {
        "reveal": "always",
        "group": "build"
      },
      "options": {
        "cwd": "${workspaceRoot}/server"
      }
    },
    {
      "label": "npm",
      "type": "shell",
      "command": "ng serve --port 4203 --proxy-config proxy.conf.json",
      "presentation": {
        "reveal": "always",
        "group": "build"
      },
      "options": {
        "cwd": "${workspaceRoot}/client-APS"
      }
    }
  ]
}

Solution

  • The following should work:

    {
        "type": "process",
        "label": "terminal",
        "command": "/bin/bash",  // <-- your shell here
        "args": [
            "-l"  // login shell for bash
        ],
        "problemMatcher": [],
        "presentation": {
            "echo": false,  // silence "Executing task ..."
            "focus": true,
            "group": "build",  // some arbitrary name for the group
            "panel": "dedicated"
        },
        "runOptions": {
            "runOn": "folderOpen"
        }
    }
    

    I was trying to achieve something very similar when I stumbled my way into this solution: Here, I'm auto-launching (and setting the focus on) the terminal when the folder is opened in vscode -- and further tasks that share the same presentation.group gets placed in split terminals when they're run (with new vs. reused splits depending on their presentation.panel)

    (The runOptions bit is superfluous for your case, but I'm keeping it in case it is helpful for someone)

    Note: For this example, you may or may not need the -l option depending on your settings for terminal.integrated.shell*, terminal.integrated.automationShell* and terminal.integrated.inheritEnv -- this issue has some discussion on what is involved in setting up the shell environment.