VS Code - Fix a task automation issue ‘The terminal process failed to launch (exit code: 127)’

I like to run a web server automatically whenever I open a web project in VS Code. I use VS Code tasks to do this. Suddenly, this has stopped working, without rhyme or reason! 😓

I was greeted with the following error in the integrated terminal:

terminal

* Executing task: pnpm dev

zsh:1: command not found: pnpm

* The terminal process “/usr/bin/zsh ‘-c’, ‘pnpm dev’” failed to launch (exit code: 127).
* Press any key to close the terminal

Nice to meet you exit code 127! Let’s get to know each other! 🤗

The source of the issue

If you are not familiar with tasks in VS Code, check out this post that covers this very use case.

How to run a command automatically in VS Code when you open a project

It would be great to launch a bundler or server for a web project when I open a project in VS Code. Can this be done in VS Code?

The task is running the (p)npm script called “dev”. You can see the tasks.json file below.

JSON
{
"version": "2.0.0",
"tasks": [
{
"label": "Start server on startup",
"type": "shell",
"command": "pnpm dev",
"presentation": {
"reveal": "always",
"panel": "new"
},
"runOptions": { "runOn": "folderOpen" }
}
]
}

The “dev” script is running the eleventy server in dev mode. The details of the script are not important for this discussion, but to round out the background here is an abbreviated version of my package.json:

JSON
{
"name": "some-eleventy-website",
"scripts": {
"dev": "eleventy --serve --incremental --quiet",
}
}

If I open a new integrated terminal and run pnpm dev, it runs the command successfully! It looks like it is specific to tasks.

The problem is that tasks are executed with Zsh using /bin/zsh -c, which starts a non-login, non-interactive session. This means that ~/.zshrc and ~/.zprofile are not sourced by Zsh. In my case, this means that I can’t run the necessary local npm packages in a task. The solution should be to have tasks run in an interative shell session. How do we do that?

The fix

To start an interative Zsh shell session we want to pass the i flag to Zsh. After some digging, I found that there is a task/debug profile setting that let’s you specify the environment for tasks. The setting has a version for each platform (windows/linux/osx) in the form of terminal.integrated.automationProfile.<platform>. For example, it would be terminal.integrated.automationProfile.linux for linux.

The fix for my linux setup was to add the following to the settings.json:

JSON
"terminal.integrated.automationProfile.linux": {
"path": "/usr/bin/zsh",
"args": ["-i"]
}

Tagged