Using "preLaunchTasks" and Naming a Task in Visual Studio Code

According to the documentation, it is possible to launch a program before debugging:

To launch a task before the start of each debug session, set the preLaunchTask to the name of one of the tasks specified in tasks.json.

I've not seen example syntax of a "named" task, but the schema documentation reveals a property called taskName. I tried using that to link my launch.json preLaunchTasks to the task, but it didn't work. When I launched my program, Visual Studio Code reported this error:

Could not find a unique task 'launch-core'. Make sure the task exists and that it has a unique name.

My custom "named" task looked something like this:

{
    "taskName": "launch-core",
    "version": "0.1.0",
    "command": "C:\\utils\\mystuff.exe",
    // The command is a shell script
    "isShellCommand": true,
    // Show the output window only if unrecognized errors occur.
    "showOutput": "silent",
}

I then tried changing the property name from taskName to just name, based on this link. That also didn't work.

Intellisense gives no suggestions of how to name a task.

Does anybody know how to uniquely name a task in the tasks.json file? What is the syntax? What is the property name?

Ultimately I'd like to execute two or three node.js processes before my own node.js app is launched. For example, I'd like to have the following three apps launched before my app is launched into the debugger:

sh -c 'cd ./manager/ && node manager.js'
sh -c 'cd ./adapter/ && node adapter.js'
sh -c 'cd ./core/ && node core.js'

If I'm working on a Windows box, my task might look something like this:

{
    "taskName": "core-launch",
    "version": "0.1.0",

    // The command is tsc. Assumes that tsc has been installed using npm install -g typescript
    "command": "start",

    // The command is a shell script
    "isShellCommand": true,

    // Show the output window only if unrecognized errors occur.
    "showOutput": "silent",

    // args is the HelloWorld program to compile.
    "args": [
        "ACD-Manager",
        "/B",
        "/D",
        "./manager/",
        "node",
        "manager.js"
        ]
}

The above task using using the cmd start capability. I'm not sure yet how to make several node tasks launch instead of one, but I can't even get one task to launch because of this task-naming issue.

How do I name a task in the tasks.json file?


FWIW, I'm using VS Code 1.20.1 and here's how I got my preLaunchTask to work:

In launch.json:

{
  "version": "0.2.0",
  "configurations": [
    {
        "type": "node",
        "request": "launch",
        ...
        "preLaunchTask": "npm: build",
    }
  ]
}

In my package.json:

{
  ...
  "scripts": {
     "build": "tsc"
     ...
  }
}

So, if it's still relevant, or if someone finds this thread with the same problem, I've just figured it out how it works:

In the tasks.json, you need to create a 'tasks' array - code hint will help you with that - which holds an array of objects. Inside an object, you can have the 'taskName' key-value pair.

Example:

{
    "version": "0.1.0",
    "command": "npm",
    "isShellCommand": true,
    "args": ["run-script", "webpack"],
    "showOutput": "always",
    "tasks": [
        { 
            "taskName": "runwebpack",
            "suppressTaskName": true
        }
    ]
}

In my case, I had to run the npm run-script webpack command before running my project. In the launch.json file, the "preLaunchTask": "runwebpack" will work now.

Note: the suppressTaskName is true in my example. Omitting it, or setting it to false will result in VS Code appending the taskName after the command.

A more general approach would be something like this:

{
    "version": "0.1.0",
    "command": "npm",
    "isShellCommand": true,
    "args": ["run-script"],
    "showOutput": "always",
    "tasks": [
        { "taskName": "webpack" }
    ]
}

With the latter example, you can extend the tasks array with other scripts to be run also.

Hint for my usage: npm run-script fetches what to do from the package.json file's scripts object.

Edit: this works with VS Code 1.3.1


For version 2.0.0 configuration you now use label instead of taskName.

package.json:

...
"scripts": {
    "tsc": "tsc",
    ...
}
...

launch.json (My source is in the src directory and tsc compiles to the dist directory):

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "preLaunchTask": "Compile",
            "name": "Launch Program",
            "program": "${workspaceFolder}/src/index.ts",
            "outFiles": [
                "${workspaceFolder}/dist/**/*.js"
            ],
            "protocol": "inspector",
            "sourceMaps": true
        }
    ]
}

tasks.json:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Compile",
            "type": "npm",
            "script": "tsc",
            "problemMatcher": []
        }
    ]
}

For vscode 1.36.1 (1.36.1):

tasks.json:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build:tsc",
      "type": "npm",
      "script": "build:tsc"
    },
    {
      "label": "clean",
      "type": "npm",
      "script": "clean"
    },
    {
      "label": "build",
      "dependsOrder": "sequence",
      "dependsOn": ["clean", "build:tsc"]
    }
  ]
}

launch.json:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "program": "${workspaceFolder}/dist/main.js",
      "preLaunchTask": "build",
      "outFiles": ["${workspaceFolder}/dist/**/*.js"],
      "console": "integratedTerminal"
    }
  ]
}

Before running node ${workspaceFolder}/dist/main.js, the preLaunchTask will run build task firstly which includes two subtasks: clean and build. It will run clean task firstly, then run build task.

You can specify the label of a task to preLaunchTask option.