Using VS Code tasks for React Native development

VS Code is hands down the best editor for productivity and debugging when it comes to React Native.

I'm a nerd so I always go over the top in (mis-)using tools. Not a lot of people know about VS Code's Tasks feature or do not care about it, but for me it's something essential to include in my React Native projects. I don't like to leave VS Code during development.

Tasks are simple JSON objects that execute a task and can be be summoned via the keyboard shortcut cmd+shift+b or in the command palette via Tasks: Run Build Task. A task can be a script, a command, an npm run-task, a make task etc.

By default, when you don't write tasks yourself VS Code will autosuggest all detected task runners like Make, NPM, Gulp, Rake. For React Native development I recommend you bundle a JSON file with the tasks relevant to the project.

In contrast to other VS Code settings like Snippets or config, Tasks are scoped to a project and can not be applied globally in your VS Code installation. Tasks for a project reside in ./vscode/tasks.json

Here is a list of Tasks I tend to use again and again in every React Native project:

And here is the config. I mostly rely on make and NPM for running tasks, with the odd shell command being directly invoked:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "🚇  Start Metro",
      "detail": "Starts the Metro bundler",
      "type": "npm",
      "script": "start",
      "group": "build"
    },
    {
      "label": "🍎  Run iOS (Debug, Simulator)",
      "detail": "Runs the Debug scheme in the iOS Simulator",
      "type": "npm",
      "script": "ios:debug",
      "group": "build"
    },
    {
      "label": "🍎  Run iOS (Debug, Device)",
      "detail": "Runs the Debug scheme against a USB connected device",
      "type": "shell",
      "command": "npm run ios:debug -- --device",
      "group": "build"
    },
    {
      "label": "🤖  Run Android (Debug)",
      "detail": "Runs the debug variant against all devices/emulators available to adb",
      "type": "npm",
      "script": "android:debug",
      "group": "build"
    },
    {
      "label": "📦  Install Cocoapods",
      "detail": "Installs Cocoapod dependencies for iOS",
      "type": "shell",
      "group": "build",
      "command": "bundle exec pod install --project-directory=./ios",
    },
    {
      "label": "📦  Clean install",
      "detail": "Deletes all dependencies and artifacts and reinstalls them from scratch",
      "type": "shell",
      "command": "make clean_install",
      "group": "build",
      "presentation": {
        "echo": true,
        "reveal": "silent",
        "focus": false,
        "panel": "shared",
        "showReuseMessage": false,
        "clear": true
      }
    },
    {
      "label": "🏷  Compile Typescript",
      "type": "typescript",
      "tsconfig": "tsconfig.json",
      "problemMatcher": [
        "$tsc"
      ],
      "group": "build"
      "presentation": {
        "echo": true,
        "reveal": "always",
        "focus": false,
        "panel": "shared",
        "showReuseMessage": true,
        "clear": true
      }
    },
    {
      "label": "🛠  Open in Xcode",
      "detail": "Opens the iOS workspace in Xcode",
      "type": "shell",
      "command": "xed ios/Project.xcworkspace",
      "group": "build",
      "presentation": {
        "echo": false,
        "reveal": "silent",
        "focus": false,
        "panel": "shared",
        "showReuseMessage": false,
        "clear": true
      }
    }
  ]
}