Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 483
Brent Arias Avatar asked Feb 10 '16 22:02

Brent Arias


People also ask

What is a prelaunch task?

preLaunchTask - to launch a task before the start of a debug session, set this attribute to the label of a task specified in tasks.json (in the workspace's .vscode folder). Or, this can be set to ${defaultBuildTask} to use your default build task.

Where is task json in VS Code?

You need to configure the tasks in a tasks. json file (located under your workspace . vscode folder) if you want to do more than simply run the task. For example, you might want to match reported problems and highlight them within VS Code, or to trigger a build task using the Run Build Task command ( kb(workbench.


3 Answers

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"      ...   } } 
like image 170
Logan Avatar answered Sep 23 '22 07:09

Logan


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

like image 28
zeroxx1986 Avatar answered Sep 22 '22 07:09

zeroxx1986


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": []
        }
    ]
}
like image 20
Eli Algranti Avatar answered Sep 20 '22 07:09

Eli Algranti