| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8"> |
| <meta name="viewport" content="width=device-width,initial-scale=1"> |
| <title>What is a Che-Theia plug-in :: Eclipse Che Documentation</title> |
| <link rel="canonical" href="https://www.eclipse.org/che/docs/che-7/end-user-guide/what-is-a-che-theia-plug-in/"> |
| <meta name="keywords" content="end-user-guide, what-is-a-che-theia-plug-in"> |
| <meta name="generator" content="Antora 2.3.4"> |
| <link rel="stylesheet" href="../../../_/css/site.css"> |
| <link rel="stylesheet" href="../../../_/css/extra.css"> |
| <link rel="stylesheet" href="../../../_/font-awesome-4.7.0/css/font-awesome.min.css"> |
| <link rel="icon" href="../../../favicon.ico" type="image/x-icon"> |
| <script async src="https://www.googletagmanager.com/gtag/js?id=UA-37306001-2"></script> |
| <script>function gtag(){dataLayer.push(arguments)};window.dataLayer=window.dataLayer||[];gtag('js',new Date());gtag('config','UA-37306001-2')</script> |
| <script>var uiRootPath = '../../../_'</script> |
| </head> |
| <body class="article"> |
| <header class="header" role="banner"> |
| <nav class="navbar"> |
| <div class="navbar-brand"> |
| <div class="navbar-item"> |
| <button class="navbar-burger" data-target="topbar-nav"> |
| <span></span> |
| <span></span> |
| <span></span> |
| </button> |
| <img src="../../../_/img/icon-eclipse-che.svg" class="navbar-logo" alt="Eclipse Che logo"> |
| <a href="https://www.eclipse.org/che/docs">Eclipse Che Documentation</a> |
| </div> |
| </div> |
| <div id="topbar-nav" class="navbar-menu"> |
| <div class="navbar-end"> |
| <div class="navbar-item hide-for-print"> |
| <script async src="https://cse.google.com/cse.js?cx=002898025167115630151:gnr5edrg2eo"></script> |
| <div class="gcse-searchbox" enableAutoComplete="true"></div> |
| </div> |
| <a class="navbar-item" href="https://www.eclipse.org/che/docs">Home</a> |
| <a class="navbar-item" href="https://che.eclipse.org/">Blog</a> |
| <a class="navbar-item" href="https://github.com/eclipse/che">Source Code</a> |
| </div> |
| </div> |
| </nav> |
| <div class="gcse-searchresults"></div> |
| </header><div class="body"> |
| <div class="nav-container" data-component="che-7" data-version="master"> |
| <aside class="nav"> |
| <div class="panels"> |
| <div class="nav-panel-menu is-active" data-panel="menu"> |
| <nav class="nav-menu"> |
| <h3 class="title"><a href="../../overview/introduction-to-eclipse-che/">Documentation</a></h3> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="0"> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../overview/introduction-to-eclipse-che/">Introduction to Che</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../overview/che-architecture/">Che architecture</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="0"> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../hosted-che/hosted-che/">Eclipse Che hosted by Red Hat</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="0"> |
| <button class="nav-item-toggle"></button> |
| <span class="nav-text">End-user Guide</span> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../navigating-che/">Navigating Che</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../navigating-che-using-the-dashboard/">Navigating Che: dashboard</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../importing-certificates-to-browsers/">Importing certificates to browsers</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../accessing-che-from-openshift-developer-perspective/">Navigating Che from OpenShift Developer Perspective</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../che-theia-ide-basics/">Che-Theia IDE basics</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../defining-custom-commands-for-che-theia/">Defining custom commands for Che-Theia</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../version-control/">Version Control</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../che-theia-troubleshooting/">Che-Theia Troubleshooting</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../differences-in-how-che-theia-webview-works-on-a-single-host-mode-comparing-to-a-multi-host-mode/">Differences in how Che-Theia Webview works on a single-host mode comparing to a multi-host mode</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../workspaces-overview/">Using developer workspaces</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../creating-a-workspace-from-code-sample/">Creating a workspace from code sample</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../creating-a-workspace-from-remote-devfile/">Creating a workspace from a remote devfile using the dashboard</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../creating-a-workspace-from-local-devfile-using-chectl/">Creating a workspace from local devfile using chectl</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../creating-a-workspace-by-importing-the-source-code-of-a-project/">Creating a workspace by importing the source code of a project</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../configuring-a-workspace-with-dashboard/">Configuring a workspace</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../running-a-workspace-with-dashboard/">Running a workspace</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../importing-kubernetes-applications-into-a-workspace/">Importing Kubernetes applications into a workspace</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../remotely-accessing-workspaces/">Remotely accessing workspaces</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../mounting-a-secret-as-a-file-or-an-environment-variable-into-a-workspace-container/">Mounting a secret as a file or an environment variable into a workspace container</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../authenticating-on-scm-server-with-a-personal-access-token/">Authenticating on SCM Server with a personal access token</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../authoring-devfiles/">Authoring devfiles</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../authoring-devfiles-version-1/">Authoring devfiles version 1</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../authoring-devfiles-version-2/">Authoring devfiles version 2</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../customizing-developer-environments/">Customizing developer environments</a> |
| <ul class="nav-list"> |
| <li class="nav-item is-current-page" data-depth="2"> |
| <a class="nav-link" href="./">What is a Che-Theia plug-in</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../adding-a-vs-code-extension-to-a-workspace/">Adding a VS Code extension to a workspace</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../adding-a-vs-code-extension-to-the-che-plugin-registry/">Adding a VS Code extension to the Che plug-ins registry</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../publishing-metadata-for-a-vs-code-extension/">Publishing a VS Code extension</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../testing-a-visual-studio-code-extension-in-che/">Testing a VS Code extension in Che</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../using-alternative-ides-in-che/">Using alternative IDEs in Che</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="3"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../support-for-jetbrains-ides/">JetBrains IDEs</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="../using-jetbrains-intellij-idea-community-edition/">Using IntelliJ Idea Community Edition</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="../using-jetbrains-intellij-idea-ultimate-edition/">Using IntelliJ Idea Ultimate Edition</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="../configuring-an-existing-workspace-to-use-intellij-idea/">Configuring an existing workspace to use IntelliJ IDEA</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="../using-jetbrains-webstorm/">Using WebStorm</a> |
| </li> |
| <li class="nav-item" data-depth="4"> |
| <a class="nav-link" href="../provisioning-jetbrains-activation-code-for-offline-use/">Provisioning activation code for offline use</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../support-for-theia-based-ides/">Theia-based IDEs</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../adding-tools-to-che-after-creating-a-workspace/">Adding tools to Che after creating a workspace</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../using-private-container-registries/">Using private container registries</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../using-artifact-repositories-in-a-restricted-environment/">Using artifact repositories in a restricted environment</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../using-maven-artifact-repositories/">Using Maven artifact repositories</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../using-gradle-artifact-repositories/">Using Gradle artifact repositories</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../using-python-artifact-repositories/">Using Python artifact repositories</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../using-go-artifact-repositories/">Using Go artifact repositories</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../using-nuget-artifact-repositories/">Using NuGet artifact repositories</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../using-npm-artifact-repositories/">Using npm artifact repositories</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../troubleshooting-che/">Troubleshooting Che</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../viewing-che-workspaces-logs/">Viewing Che workspaces logs</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../investigating-failures-at-a-workspace-start-using-the-verbose-mode/">Troubleshooting workspace start failures</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../troubleshooting-slow-workspaces/">Troubleshooting slow workspaces</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../troubleshooting-network-problems/">Troubleshooting network problems</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="0"> |
| <button class="nav-item-toggle"></button> |
| <span class="nav-text">Installation Guide</span> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../installation-guide/supported-platforms/">Supported platforms</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../installation-guide/configuring-the-che-installation/">Configuring the Che installation</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../installation-guide/installing-che/">Installing Che</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../installation-guide/installing-che-in-cloud/">Installing Che in cloud</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-openshift-4-using-operatorhub/">Installing Che on OpenShift 4 using OperatorHub</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-openshift-4-using-cli/">Installing Che on OpenShift 4 using CLI</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-openshift-3-using-the-operator/">Installing Che on OpenShift 3</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-kubespray/">Installing Che on Kubespray</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-aws/">Installing Che on AWS</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-google-cloud-platform/">Installing Che on Google Cloud</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-microsoft-azure/">Installing Che on Microsoft Azure</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../installation-guide/installing-che-locally/">Installing Che locally</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-codeready-containers/">Installing Che on CodeReady Containers</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-docker-desktop/">Installing Che on Docker Desktop</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-minikube/">Installing Che on Minikube</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-minishift/">Installing Che on Minishift</a> |
| </li> |
| <li class="nav-item" data-depth="3"> |
| <a class="nav-link" href="../../installation-guide/installing-che-on-kind/">Installing Che on Kind</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/using-the-chectl-management-tool/">Using the chectl management tool</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/installing-che-in-a-restricted-environment/">Installing Che in restricted environment</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../installation-guide/advanced-configuration/">Advanced configuration</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/advanced-configuration-options-for-the-che-server-component/">Advanced configuration options for Che server</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/configuring-namespace-strategies/">Configuring workspace target namespace</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/configuring-storage-strategies/">Configuring storage strategies</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/configuring-storage-types/">Configuring storage types</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/configuring-the-number-of-workspaces-that-a-user-can-run/">Configuring the number of workspaces that a user can run</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/configuring-the-number-of-workspaces-that-a-user-can-create/">Configuring the number of workspaces that a user can create</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/configuring-workspace-exposure-strategies/">Configuring workspace exposure strategies</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/configuring-workspaces-nodeselector/">Configuring workspaces nodeSelector</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/configuring-che-hostname/">Configuring Che hostname</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/configuring-ingresses/">Configuring Kubernetes Ingress</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/configuring-routes/">Configuring OpenShift Route</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/deploying-che-with-support-for-git-repositories-with-self-signed-certificates/">Deploying Che with support for Git repositories with self-signed certificates</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/installing-che-using-storage-classes/">Installing Che using storage classes</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/importing-untrusted-tls-certificates/">Importing untrusted TLS certificates to Che</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/switching-between-external-and-internal-communication/">Switching between external and internal ways in inter-component communication</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/setting-up-the-keycloak-che-username-readonly-theme-for-the-eclipse-che-login-page/">Setting up the Keycloak che-username-readonly theme for the Eclipse Che login page</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/mounting-a-secret-as-a-file-or-an-environment-variable-into-a-container/">Mounting a Secret or a ConfigMap as a file or an environment variable into a Eclipse Che container</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/enabling-dev-workspace-engine/">Enabling Dev Workspace engine</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../installation-guide/upgrading-che/">Upgrading Che</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/upgrading-che-using-operatorhub/">Upgrading Che using OperatorHub</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/upgrading-che-using-the-cli-management-tool/">Upgrading Che using the CLI management tool</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/upgrading-che-using-the-cli-management-tool-in-restricted-environment/">Upgrading Che in restricted environment</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/upgrading-che-namespace-strategies-other-than-per-user/">Updating Che namespace strategies other than 'per user'</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../installation-guide/uninstalling-che/">Uninstalling Che</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/uninstalling-che-after-operatorhub-installation-using-openshift-web-console/">Using the OpenShift web console</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/uninstalling-che-after-operatorhub-installation-using-openshift-cli/">Using OpenShift CLI</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../installation-guide/uninstalling-che-after-chectl-installation/">Using chectl</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="0"> |
| <button class="nav-item-toggle"></button> |
| <span class="nav-text">Administration Guide</span> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../administration-guide/che-architecture-overview/">Che architecture</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/che-workspace-controller/">Che workspace controller</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/che-workspaces-architecture/">Che workspaces architecture</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../administration-guide/calculating-che-resource-requirements/">Calculating Che resource requirements</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../administration-guide/customizing-the-registries/">Customizing the registries</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/building-custom-registry-images/">Building custom registry images</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/running-custom-registries/">Running custom registries</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../administration-guide/retrieving-che-logs/">Retrieving Che logs</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/configuring-server-logging/">Configuring server logging</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/viewing-kubernetes-events/">Accessing Kubernetes events on OpenShift</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/viewing-operator-events/">Viewing the Operator events on OpenShift</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/viewing-che-server-logs/">Viewing Che server logs</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/viewing-external-service-logs/">Viewing external service logs</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/viewing-plug-in-broker-logs/">Viewing Plug-in broker logs</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/collecting-logs-using-chectl/">Collecting logs using chectl</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../administration-guide/monitoring-che/">Monitoring Che</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../administration-guide/tracing-che/">Tracing Che</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../administration-guide/backup-and-disaster-recovery/">Backup and disaster recovery</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/external-database-setup/">External database setup</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/persistent-volumes-backups/">Persistent Volumes backups</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../administration-guide/caching-images-for-faster-workspace-start/">Caching images for faster workspace start</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/defining-the-list-of-images-to-pull/">Defining the list of images</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/defining-the-memory-parameters-for-the-image-puller/">Defining the memory settings</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/installing-image-puller-using-che-operator/">Installing using the Che Operator</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/installing-image-puller-on-kubernetes-using-the-image-puller-operator/">Installing using the Kubernetes Image Puller Operator</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/installing-image-puller-on-openshift-using-operatorhub/">Installing on OpenShift 4</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/installing-image-puller-on-openshift-using-openshift-templates/">Installing on OpenShift 3</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/installing-image-puller-on-kubernetes-using-helm/">Installing using Helm</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../administration-guide/managing-identities-and-authorizations/">Managing identities and authorizations</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/authenticating-users/">Authenticating users</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/authorizing-users/">Authorizing users</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/configuring-authorization/">Configuring authorization</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/configuring-openshift-oauth/">Configuring OpenShift OAuth</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../administration-guide/removing-user-data/">Removing user data</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="0"> |
| <button class="nav-item-toggle"></button> |
| <span class="nav-text">Contributor Guide</span> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../contributor-guide/branding-che-theia/">Branding Che-Theia</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../contributor-guide/developing-che-theia-plug-ins/">Developing Che-Theia plug-ins</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../contributor-guide/testing-che-theia-plug-ins/">Testing Che-Theia plug-ins</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../contributor-guide/publishing-che-theia-plug-ins/">Publishing Che-Theia plug-ins</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../contributor-guide/adding-support-for-a-new-language/">Adding support for a new language</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../contributor-guide/adding-support-for-a-new-debugger/">Adding support for a new debugger</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../contributor-guide/che-extensibility-reference/">Che extensibility reference</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../contributor-guide/che-extension-points/">Che extension points</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../contributor-guide/che-theia-plug-in-api/">Che-Theia plug-in API</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../contributor-guide/debug-adapter-protocol/">Debug Adapter Protocol</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../contributor-guide/language-server-protocol/">Language Server Protocol</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="0"> |
| <button class="nav-item-toggle"></button> |
| <span class="nav-text">Extensions</span> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../extensions/eclipse-che4z/">Eclipse Che4z</a> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../extensions/openshift-connector-overview/">OpenShift Connector</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../extensions/features-of-openshift-connector/">Features of OpenShift Connector</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../extensions/installing-openshift-connector-in-che/">Installing OpenShift Connector in Eclipse Che</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../extensions/authenticating-with-openshift-connector-from-che/">Authenticating with OpenShift Connector from Eclipse Che</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../extensions/creating-components-with-openshift-connector-in-che/">Creating Components with OpenShift Connector in Eclipse Che</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../extensions/connecting-source-code-from-github-to-a-openshift-component-using-openshift-connector/">Connecting source code from GitHub to a OpenShift Component</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <button class="nav-item-toggle"></button> |
| <a class="nav-link" href="../../extensions/telemetry/">Telemetry</a> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../extensions/creating-a-telemetry-plugin/">Creating A Telemetry Plugin</a> |
| </li> |
| <li class="nav-item" data-depth="2"> |
| <a class="nav-link" href="../../extensions/the-woopra-telemetry-plugin/">The Woopra Telemetry Plugin</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../extensions/java-lombok/">Java Lombok</a> |
| </li> |
| </ul> |
| </li> |
| <li class="nav-item" data-depth="0"> |
| <ul class="nav-list"> |
| <li class="nav-item" data-depth="1"> |
| <a class="nav-link" href="../../glossary/che-glossary/">Che glossary</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </nav> |
| </div> |
| <div class="nav-panel-explore" data-panel="explore"> |
| <div class="context"> |
| <span class="title">Documentation</span> |
| <span class="version">master</span> |
| </div> |
| <ul class="components"> |
| <li class="component is-current"> |
| <a class="title" href="../../overview/introduction-to-eclipse-che/">Documentation</a> |
| <ul class="versions"> |
| <li class="version is-current is-latest"> |
| <a href="../../overview/introduction-to-eclipse-che/">master</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </aside> |
| </div> |
| <main class="article"> |
| <div class="toolbar" role="navigation"> |
| <button class="nav-toggle"></button> |
| <a href="../../overview/introduction-to-eclipse-che/" class="home-link"></a> |
| <nav class="breadcrumbs" aria-label="breadcrumbs"> |
| <ul> |
| <li><a href="../../overview/introduction-to-eclipse-che/">Documentation</a></li> |
| <li>End-user Guide</li> |
| <li><a href="../customizing-developer-environments/">Customizing developer environments</a></li> |
| <li><a href="./">What is a Che-Theia plug-in</a></li> |
| </ul> |
| </nav> |
| <div class="edit-this-page"><a href="https://github.com/eclipse/che-docs/edit/master/modules/end-user-guide/pages/what-is-a-che-theia-plug-in.adoc">Edit this Page</a></div> |
| </div> |
| <div class="content"> |
| <aside class="toc sidebar" data-title="Contents" data-levels="2"> |
| <div class="toc-menu"></div> |
| </aside> |
| <article class="doc"> |
| <h1 class="page">What is a Che-Theia plug-in</h1> |
| <div id="preamble"> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>A Che-Theia plug-in is an extension of the development environment isolated from the IDE. Plug-ins can be packaged as files or containers to provide their own dependencies.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Extending Che-Theia using plug-ins can enable the following capabilities:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Language support:</strong> Extend the supported languages by relying on the <a href="https://microsoft.github.io/language-server-protocol/">Language Server Protocol</a>.</p> |
| </li> |
| <li> |
| <p><strong>Debuggers:</strong> Extend debugging capabilities with the <a href="https://microsoft.github.io/debug-adapter-protocol/">Debug Adapter Protocol</a>.</p> |
| </li> |
| <li> |
| <p><strong>Development Tools:</strong> Integrate your favorite linters, and as testing and performance tools.</p> |
| </li> |
| <li> |
| <p><strong>Menus, panels, and commands:</strong> Add your own items to the IDE components.</p> |
| </li> |
| <li> |
| <p><strong>Themes:</strong> Build custom themes, extend the UI, or customize icon themes.</p> |
| </li> |
| <li> |
| <p><strong>Snippets, code formatting, and syntax highlighting:</strong> Enhance comfort of use with supported programming languages.</p> |
| </li> |
| <li> |
| <p><strong>Keybindings:</strong> Add new keyboard mapping and popular keybindings to make the environment feel natural.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_features_and_benefits_of_che_theia_plug_ins"><a class="anchor" href="#_features_and_benefits_of_che_theia_plug_ins"></a>Features and benefits of Che-Theia plug-ins</h2> |
| <div class="sectionbody"> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 33.3333%;"> |
| <col style="width: 33.3333%;"> |
| <col style="width: 33.3334%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>Features</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Benefits</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Fast Loading</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Plug-ins are loaded at runtime and are already compiled. IDE is loading the plug-in code.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Avoid any compilation time. Avoid post-installation steps.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Secure Loading</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Plug-ins are loaded separately from the IDE. The IDE stays always in a usable state.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Plug-ins do not break the whole IDE if it has bugs. Handle network issue.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Tools Dependencies</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Dependencies for the plug-in are packaged with the plug-in in its own container.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">No-installation for tools. Dependencies running into container.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Code Isolation</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Guarantee that plug-ins cannot block the main functions of the IDE like opening a file or typing</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Plug-ins are running into separate threads. Avoid dependencies mismatch.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>VS Code Extension Compatibility</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Extend the capabilities of the IDE with existing VS Code Extensions.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Target multiple platform. Allow easy discovery of Visual Studio Code Extension with required installation.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="che-theia-plug-in-concept-in-detail_che"><a class="anchor" href="#che-theia-plug-in-concept-in-detail_che"></a>Che-Theia plug-in concept in detail</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Eclipse Che provides a default web IDE for workspaces: Che-Theia. It is based on Eclipse Theia. It is a slightly different version than the plain Eclipse Theia one because there are functionalities that have been added based on the nature of the Eclipse Che workspaces. This version of Eclipse Theia for Che is called <strong>Che-Theia</strong>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>You can extend the IDE provided with Eclipse Che by building a <strong>Che-Theia plug-in</strong>. Che-Theia plug-ins are compatible with any other Eclipse Theia-based IDE.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="client-side-and-server-side-che-theia-plug-ins_che"><a class="anchor" href="#client-side-and-server-side-che-theia-plug-ins_che"></a>Client-side and server-side Che-Theia plug-ins</h3> |
| <div class="paragraph"> |
| <p>The Che-Theia editor plug-ins let you add languages, debuggers, and tools to your installation to support your development workflow. Plug-ins run when the editor completes loading. If a Che-Theia plug-in fails, the main Che-Theia editor continues to work.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Che-Theia plug-ins run either on the client side or on the server side. This is a scheme of the client and server-side plug-in concept:</p> |
| </div> |
| <div class="imageblock"> |
| <div class="content"> |
| <img src="../_images/extensibility/client-server-side-plug-ins.svg" alt="client server side plug ins"> |
| </div> |
| <div class="title">Figure 1. Client and server-side Che-Theia plug-ins</div> |
| </div> |
| <div class="paragraph"> |
| <p>The same Che-Theia plug-in API is exposed to plug-ins running on the client side (Web Worker) or the server side (Node.js).</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="che-theia-plug-in-apis_che"><a class="anchor" href="#che-theia-plug-in-apis_che"></a>Che-Theia plug-in APIs</h3> |
| <div class="paragraph"> |
| <p>For the purpose of providing tool isolation and easy extensibility in Eclipse Che, the Che-Theia IDE has a set of plug-in APIs. The APIs are compatible with Visual Studio Code extension APIs. In most cases, Che-Theia can run VS Code extensions as its own plug-ins.</p> |
| </div> |
| <div class="paragraph"> |
| <p>When developing a plug-in that depends on or interacts with components of Che workspaces (containers, preferences, factories), use the Che APIs embedded in Che-Theia.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="che-theia-plug-in-capabilities_che"><a class="anchor" href="#che-theia-plug-in-capabilities_che"></a>Che-Theia plug-in capabilities</h3> |
| <div class="paragraph"> |
| <p>Che-Theia plug-ins have the following capabilities:</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 33.3333%;"> |
| <col style="width: 33.3333%;"> |
| <col style="width: 33.3334%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>Plug-in</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Repository</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Che Extended Tasks</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Handles the Che commands and provides the ability to start those into a specific container of the workspace.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/plugins/task-plugin">Task plug-in</a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Che Extended Terminal</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Allows to provide terminal for any of the containers of the workspace.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/extensions/eclipse-che-theia-terminal">Extended Terminal extension</a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Che Factory</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Handles the Eclipse Che Factories</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/plugins/workspace-plugin">Workspace plug-in</a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Che Container</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Provides a container view that shows all the containers that are running in the workspace and allows to interact with them.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/plugins/containers-plugin">Containers plug-in</a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Dashboard</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Integrates the IDE with the <strong>Dashboard</strong> and facilitate the navigation.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/extensions/eclipse-che-theia-dashboard">Che-Theia Dashbord extension</a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Che APIs</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Extends the IDE APIs to allow interacting with Che-specific components (workspaces, preferences).</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/eclipse-che/che-theia/tree/master/extensions/eclipse-che-theia-plugin-ext">Che-Theia API extension</a></p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <div class="sect2"> |
| <h3 id="vs-code-extensions-and-eclipse-theia-plug-ins_che"><a class="anchor" href="#vs-code-extensions-and-eclipse-theia-plug-ins_che"></a>VS Code extensions and Eclipse Theia plug-ins</h3> |
| <div class="paragraph"> |
| <p>A Che-Theia plug-in can be based on a VS Code extension or an Eclipse Theia plug-in.</p> |
| </div> |
| <div class="dlist"> |
| <dl> |
| <dt class="hdlist1">A Visual Studio Code extension</dt> |
| <dd> |
| <p>To repackage a VS Code extension as a Che-Theia plug-in with its own set of dependencies, package the dependencies into a container. This ensures that Eclipse Che users do not need to install the dependencies when using the extension. See <a href="../adding-a-vs-code-extension-to-a-workspace/" class="page">Adding a VS Code extension to a workspace</a>.</p> |
| </dd> |
| <dt class="hdlist1">An Eclipse Theia plug-in</dt> |
| <dd> |
| <p>You can build a Che-Theia plug-in by implementing an Eclipse Theia plug-in and packaging it to Eclipse Che.</p> |
| </dd> |
| </dl> |
| </div> |
| <div class="ulist"> |
| <div class="title">Additional resources</div> |
| <ul> |
| <li> |
| <p><a href="#embedded-and-remote-che-theia-plug-ins_che">Embedded and remote Che-Theia plug-ins</a></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><!-- vale Vale.Spelling = NO --></p> |
| </div> |
| <div class="paragraph"> |
| <p><!-- vale Vale.Terms = NO --></p> |
| </div> |
| <div class="paragraph"> |
| <p><!-- vale IBM.Usage = NO --></p> |
| </div> |
| <div class="paragraph"> |
| <p><!-- vale IBM.PassiveVoice = NO --></p> |
| </div> |
| <div class="paragraph"> |
| <p><!-- vale IBM.Slash = NO --></p> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="che-theia-plug-in-metadata_che"><a class="anchor" href="#che-theia-plug-in-metadata_che"></a>Che-Theia plug-in metadata</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Che-Theia plug-in metadata is information about individual plug-ins for the plug-in registry.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The Che-Theia plug-in metadata, for each specific plug-in, is defined in a <code>meta.yaml</code> file. These files can be referenced in a devfile to include Che-Theia plug-ins in a workspace.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Here is an overview of all fields that can be available in plugin meta YAML files. This document represents the <a href="https://github.com/eclipse-che/che-plugin-registry#user-content-plugin-meta-yaml-structure">plugin meta YAML structure (version 3)</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In the <a href="https://github.com/eclipse-che/che-plugin-registry/tree/7.32.0">Che plug-ins registry repository</a>, the <code>che-theia-plugins.yaml</code> contains a list of all Che-Theia plug-ins in the registry. Build the registry container image to generate the <code>meta.yaml</code> file.</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 1. <code>meta.yml</code></caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>apiVersion</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Version 2 and higher where version is 1 supported for backwards compatibility</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>category</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Available: Category must be set to one of the followings: <code>Editor</code>, <code>Debugger</code>, <code>Formatter</code>, <code>Language</code>, <code>Linter</code>, <code>Snippet</code>, <code>Theme</code>, <code>Other</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>description</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Short description of plugin’s purpose</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>displayName</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Name shown in user dashboard</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>deprecate</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Optional; section for deprecating plugins in favor of others</p> |
| <p class="tableblock"> * autoMigrate - boolean</p> |
| <p class="tableblock"> * migrateTo - new <code>org/plugin-id/version</code>, for example <code>redhat/vscode-apache-camel/latest</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>firstPublicationDate</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Not required to be present in YAML, as if not present, it will be generated during Plugin Registry dockerimage build</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>latestUpdateDate</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Not required to be present in YAML, as if not present, it will be generated during Plugin Registry dockerimage build</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>icon</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">URL of an SVG or PNG icon</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Name (no spaces allowed), must match [-a-z0-9]</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>publisher</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Name of the publisher, must match [-a-z0-9]</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>repository</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">URL for plugin repository, for example, GitHub</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>title</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Plugin title (long)</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>type</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>Che Plugin</code>, <code>VS Code extension</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>version</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Version information, for example: 7.5.1, [-.a-z0-9]</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>spec</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Specifications (see below)</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 2. <code>spec</code> attributes</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>endpoints</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Optional; plugin endpoint.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>containers</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Optional; sidecar containers for the plug-in. Che Plugin and VS Code extension supports only one container</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>initContainers</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Optional; sidecar init containers for the plug-in</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>workspaceEnv</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Optional; environment variables for the workspace</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>extensions</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Optional; Attribute that is required for VS Code and Che-Theia plug-ins in a form list of URLs to plug-in artefacts, such as .vsix or .theia files</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 3. <code>spec.containers</code>. Notice: <code>spec.initContainers</code> has absolutely the same container definition.</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Sidecar container name</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>image</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Absolute or relative container image URL</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>memoryLimit</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenShift memory limit string, for example <code>512Mi</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>memoryRequest</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenShift memory request string, for example <code>512Mi</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cpuLimit</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenShift CPU limit string, for example <code>2500m</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cpuRequest</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenShift CPU request string, for example <code>125m</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>env</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">List of environment variables to set in the sidecar</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>command</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">String array definition of the root process command in the container</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>args</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">String array arguments for the root process command in the container</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>volumes</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Volumes required by the plug-in</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>ports</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Ports exposed by the plug-in (on the container)</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>commands</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Development commands available to the plug-in container</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>mountSources</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Boolean flag to bound volume with source code <code>/projects</code> to the plug-in container</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>initContainers</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Optional; init containers for sidecar plugin</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>Lifecycle</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Container lifecycle hooks. See <a href="https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/"><code>lifecycle</code> description</a></p></td> |
| </tr> |
| </tbody> |
| </table> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 4. <code>spec.containers.env</code> and <code>spec.initContainers.env</code> attributes. Notice: <code>workspaceEnv</code> has absolutely the same attributes</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Environment variable name</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>value</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Environment variable value</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 5. <code>spec.containers.volumes</code> and <code>spec.initContainers.volumes</code> attributes</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>mountPath</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Path to the volume in the container</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Volume name</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>ephemeral</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">If true, the volume is ephemeral, otherwise the volume is persisted</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 6. <code>spec.containers.ports</code> and <code>spec.initContainers.ports</code> attributes</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>exposedPort</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Exposed port</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 7. <code>spec.containers.commands</code> and <code>spec.initContainers.commands</code> attributes</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Command name</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>workingDir</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Command working directory</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>command</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">String array that defines the development command</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 8. <code>spec.endpoints</code> attributes</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Name (no spaces allowed), must match [-a-z0-9]</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>public</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>, <code>false</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>targetPort</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Target port</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>attributes</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Endpoint attributes</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 9. <code>spec.endpoints.attributes</code> attributes</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>protocol</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Protocol, example: <code>ws</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>type</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>ide</code>, <code>ide-dev</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>discoverable</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>, <code>false</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>secure</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>, <code>false</code>. If <code>true</code>, then the endpoint is assumed to listen solely on <code>127.0.0.1</code> and is exposed using a JWT proxy</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cookiesAuthEnabled</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>, <code>false</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>requireSubdomain</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>, <code>false</code>. If <code>true</code>, the endpoint is exposed on subdomain in single-host mode.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 10. <code>spec.containers.lifecycle</code> and <code>spec.initContainers.lifecycle</code> attributes</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>postStart</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The <code>postStart</code> event that runs immediately after a Container is started. See <a href="https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/">postStart and preStop handlers</a></p> |
| <p class="tableblock">* <code>exec</code>: Executes a specific command, resources consumed by the command are counted against the Container</p> |
| <p class="tableblock">* <code>command</code>: ["/bin/sh", "-c", "/bin/post-start.sh"]</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>preStop</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The <code>preStop</code> event that runs before a Container is terminated. See <a href="https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/">postStart and preStop handlers</a></p> |
| <p class="tableblock">* <code>exec</code>: Executes a specific command, resources consumed by the command are counted against the Container</p> |
| <p class="tableblock">* <code>command</code>: ["/bin/sh", "-c", "/bin/post-start.sh"]</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="listingblock"> |
| <div class="title">Example <code>meta.yaml</code> for a Che-Theia plug-in: the Che machine-exec Service</div> |
| <div class="content"> |
| <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml"> apiVersion: v2 |
| publisher: eclipse |
| name: che-machine-exec-plugin |
| version: 7.9.2 |
| type: Che Plugin |
| displayName: Che machine-exec Service |
| title: Che machine-exec Service Plugin |
| description: Che Plug-in with che-machine-exec service to provide creation terminal |
| or tasks for Eclipse CHE workspace containers. |
| icon: https://www.eclipse.org/che/images/logo-eclipseche.svg |
| repository: https://github.com/eclipse-che/che-machine-exec/ |
| firstPublicationDate: "2020-03-18" |
| category: Other |
| spec: |
| endpoints: |
| - name: "che-machine-exec" |
| public: true |
| targetPort: 4444 |
| attributes: |
| protocol: ws |
| type: terminal |
| discoverable: false |
| secure: true |
| cookiesAuthEnabled: true |
| containers: |
| - name: che-machine-exec |
| image: "quay.io/eclipse/che-machine-exec:7.9.2" |
| ports: |
| - exposedPort: 4444 |
| command: ['/go/bin/che-machine-exec', '--static', '/cloud-shell', '--url', '127.0.0.1:4444']</code></pre> |
| </div> |
| </div> |
| <div class="listingblock"> |
| <div class="title">Example <code>meta.yaml</code> for a VisualStudio Code extension: the AsciiDoc support extension</div> |
| <div class="content"> |
| <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">apiVersion: v2 |
| category: Language |
| description: This extension provides a live preview, syntax highlighting and snippets for the AsciiDoc format using Asciidoctor flavor |
| displayName: AsciiDoc support |
| firstPublicationDate: "2019-12-02" |
| icon: https://www.eclipse.org/che/images/logo-eclipseche.svg |
| name: vscode-asciidoctor |
| publisher: joaompinto |
| repository: https://github.com/asciidoctor/asciidoctor-vscode |
| title: AsciiDoctor Plug-in |
| type: VS Code extension |
| version: 2.7.7 |
| spec: |
| extensions: |
| - https://github.com/asciidoctor/asciidoctor-vscode/releases/download/v2.7.7/asciidoctor-vscode-2.7.7.vsix</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p><!-- vale Vale.Spelling = YES --></p> |
| </div> |
| <div class="paragraph"> |
| <p><!-- vale Vale.Terms = YES --></p> |
| </div> |
| <div class="paragraph"> |
| <p><!-- vale IBM.Usage = YES --></p> |
| </div> |
| <div class="paragraph"> |
| <p><!-- vale IBM.PassiveVoice = YES --></p> |
| </div> |
| <div class="paragraph"> |
| <p><!-- vale IBM.Slash = YES --></p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="che-theia-plug-in-lifecycle_che"><a class="anchor" href="#che-theia-plug-in-lifecycle_che"></a>Che-Theia plug-in lifecycle</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Every time a user starts a Che workspace, a Che-Theia plug-in life cycle process starts. The steps of this process are as follows:</p> |
| </div> |
| <div class="olist arabic"> |
| <ol class="arabic"> |
| <li> |
| <p>Che server checks for plug-ins to start from the workspace definition.</p> |
| </li> |
| <li> |
| <p>Che server retrieves plug-in metadata, recognizes each plug-in type, and stores them in memory.</p> |
| </li> |
| <li> |
| <p>Che server selects a broker according to the plug-in type.</p> |
| </li> |
| <li> |
| <p>The broker processes the installation and deployment of the plug-in. The installation process of the plug-in differs for each specific broker.</p> |
| </li> |
| </ol> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Plug-ins exist in various types. A broker ensures the success of a plug-in deployment by meeting all installation requirements. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="imageblock"> |
| <div class="content"> |
| <a class="image" href="../_images/extensibility/che-theia-plug-in-lifecycle.svg"><img src="../_images/extensibility/che-theia-plug-in-lifecycle.svg" alt="che theia plug in lifecycle"></a> |
| </div> |
| <div class="title">Figure 2. Che-Theia plug-in lifecycle</div> |
| </div> |
| <div class="paragraph"> |
| <p>Before a Che workspace is launched, Che server starts the workspace containers:</p> |
| </div> |
| <div class="olist arabic"> |
| <ol class="arabic"> |
| <li> |
| <p>The Che-Theia plug-in broker extracts the information about sidecar containers that a particular plug-in needs from the <code>.theia</code> file.</p> |
| </li> |
| <li> |
| <p>The broker sends the appropriate container information to Che server.</p> |
| </li> |
| <li> |
| <p>The broker copies the Che-Theia plug-in to a volume to have it available for the Che-Theia editor container.</p> |
| </li> |
| <li> |
| <p>Che server then starts all the containers of the workspace.</p> |
| </li> |
| <li> |
| <p>Che-Theia starts in its container and checks the correct folder to load the plug-ins.</p> |
| </li> |
| </ol> |
| </div> |
| <div class="olist arabic"> |
| <div class="title">A user experience with Che-Theia plug-in lifecycle</div> |
| <ol class="arabic"> |
| <li> |
| <p>When a user opens a browser tab with Che-Theia, Che-Theia starts a new plug-in session with:</p> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Web Worker for frontend</p> |
| </li> |
| <li> |
| <p>Node.js for backend</p> |
| </li> |
| </ul> |
| </div> |
| </li> |
| <li> |
| <p>Che-Theia notifies all Che-Theia plug-ins with the start of the new session by calling the <code>start()</code> function for each triggered plug-in.</p> |
| </li> |
| <li> |
| <p>A Che-Theia plug-in session runs and interacts with the Che-Theia backend and frontend.</p> |
| </li> |
| <li> |
| <p>When the user closes the Che-Theia browser tab, or the session ended on a timeout limit, Che-Theia notifies all plug-ins with the <code>stop()</code> function for each triggered plug-in.</p> |
| </li> |
| </ol> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="embedded-and-remote-che-theia-plug-ins_che"><a class="anchor" href="#embedded-and-remote-che-theia-plug-ins_che"></a>Embedded and remote Che-Theia plug-ins</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Developer workspaces in Eclipse Che provide all dependencies needed to work on a project. The application includes the dependencies needed by all the tools and plug-ins used.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Based on the required dependencies, Che-Theia plug-in can run as:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Embedded, also know as local</p> |
| </li> |
| <li> |
| <p>Remote</p> |
| </li> |
| </ul> |
| </div> |
| <div class="sect2"> |
| <h3 id="embedded-or-local-plug-ins_che"><a class="anchor" href="#embedded-or-local-plug-ins_che"></a>Embedded (local) plug-ins</h3> |
| <div class="paragraph"> |
| <p>The Embedded plug-ins are plug-ins without specific dependencies that are injected into the Che-Theia IDE. These plug-ins use the Node.js runtime, which runs in the IDE container.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Examples:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Code linting</p> |
| </li> |
| <li> |
| <p>New set of commands</p> |
| </li> |
| <li> |
| <p>New UI components</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>To include a Che-Theia plug-in or VS Code extension, define a URL to the plug-in <code>.theia</code> archive binary in the <code>meta.yaml</code> file. See |
| <a href="../adding-a-vs-code-extension-to-a-workspace/" class="page">Adding a VS Code extension to a workspace</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>When starting a workspace, Che downloads and unpacks the plug-in binaries and includes them in the Che-Theia editor container. The Che-Theia editor initializes the plug-ins when it starts.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="remote-plug-ins_che"><a class="anchor" href="#remote-plug-ins_che"></a>Remote plug-ins</h3> |
| <div class="paragraph"> |
| <p>The plug-in relies on dependencies or it has a back end. It runs in its own sidecar container, and all dependencies are packaged in the container.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A remote Che-Theia plug-in consist of two parts:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Che-Theia plug-in or VS Code extension binaries. The definition in the <code>meta.yaml</code> file is the same as for embedded plug-ins.</p> |
| </li> |
| <li> |
| <p>Container image definition, for example, <code>eclipse/che-theia-dev:nightly</code>. From this image, Che creates a separate container inside a workspace.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Examples:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Java Language Server</p> |
| </li> |
| <li> |
| <p>Python Language Server</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>When starting a workspace, Che creates a container from the plug-in image, downloads and unpacks the plug-in binaries, and includes them in the created container. The Che-Theia editor connects to the remote plug-ins when it starts.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_comparison_matrix"><a class="anchor" href="#_comparison_matrix"></a>Comparison matrix</h3> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Embedded plug-ins are those Che-Theia plug-ins or VS Code extensions that do not require extra dependencies inside its container.</p> |
| </li> |
| <li> |
| <p>Remote plug-ins are containers that contain a plug-in with all required dependencies.</p> |
| </li> |
| </ul> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 11. Che-Theia plug-in comparison matrix: embedded vs remote</caption> |
| <colgroup> |
| <col style="width: 25%;"> |
| <col style="width: 25%;"> |
| <col style="width: 25%;"> |
| <col style="width: 25%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"></th> |
| <th class="tableblock halign-left valign-top">Configure RAM per plug-in</th> |
| <th class="tableblock halign-left valign-top">Environment dependencies</th> |
| <th class="tableblock halign-left valign-top">Create separated container</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <th class="tableblock halign-left valign-top"><p class="tableblock">Remote</p></th> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">TRUE</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Plug-in uses dependencies defined in the remote container.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">TRUE</p></td> |
| </tr> |
| <tr> |
| <th class="tableblock halign-left valign-top"><p class="tableblock">Embedded</p></th> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">FALSE (users can configure RAM for the whole editor container, but not per plug-in)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Plug-in uses dependencies from the editor container; if container does not include these dependencies, the plug-in fails or does not function as expected.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">FALSE</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>Depending on your use case and the capabilities provided by your plug-in, select one of the described running modes.</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="remote-plug-in-endpoint_che"><a class="anchor" href="#remote-plug-in-endpoint_che"></a>Remote plug-in endpoint</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Eclipse Che has a remote plug-in endpoint service to start VS Code Extensions and Che-Theia plug-ins in separate containers. Eclipse Che injects the remote plug-in endpoint binaries into each remote plug-in container. This service starts remote extensions and plug-ins defined in the plug-in <code>meta.yaml</code> file and connects them to the Che-Theia editor container.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The remote plug-in endpoint creates a plug-in API proxy between the remote plug-in container and the Che-Theia editor container. The remote plug-in endpoint is also an interceptor for some plug-in API parts, which it launches inside a remote sidecar container rather than an editor container. Examples: terminal API, debug API.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The remote plug-in endpoint executable command is stored in the environment variable of the remote plug-in container: <code>PLUGIN_REMOTE_ENDPOINT_EXECUTABLE</code>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Eclipse Che provides two ways to start the remote plug-in endpoint with a sidecar image:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Defining a <code>launch</code> remote plug-in endpoint using a Dockerfile. To use this method, patch an original image and rebuild it.</p> |
| </li> |
| <li> |
| <p>Defining a <code>launch</code> remote plug-in endpoint in the plug-in <code>meta.yaml</code> file. Use this method to avoid patching an original image.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="sect2"> |
| <h3 id="defining-a-launch-remote-plug-in-endpoint-using-dockerfile_che"><a class="anchor" href="#defining-a-launch-remote-plug-in-endpoint-using-dockerfile_che"></a>Defining a <code>launch</code> remote plug-in endpoint using Dockerfile</h3> |
| <div class="paragraph"> |
| <p>To start a remote plug-in endpoint, set the <code>PLUGIN_REMOTE_ENDPOINT_EXECUTABLE</code> environment variable in the Dockerfile.</p> |
| </div> |
| <div class="ulist"> |
| <div class="title">Procedure</div> |
| <ul> |
| <li> |
| <p>Start a remote plug-in endpoint using the <code>CMD</code> command in the Dockerfile:</p> |
| <div class="listingblock"> |
| <div class="title">Dockerfile example</div> |
| <div class="content"> |
| <pre class="highlightjs highlight"><code>FROM fedora:30 |
| |
| RUN dnf update -y && dnf install -y nodejs htop && node -v |
| |
| RUN mkdir /home/user |
| |
| ENV HOME=/home/user |
| |
| RUN mkdir /projects \ |
| && chmod -R g+rwX /projects \ |
| && chmod -R g+rwX "${HOME}" |
| |
| CMD ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}</code></pre> |
| </div> |
| </div> |
| </li> |
| <li> |
| <p>Start a remote plug-in endpoint using the <code>ENTRYPOINT</code> command in the Dockerfile:</p> |
| <div class="listingblock"> |
| <div class="title">Dockerfile example</div> |
| <div class="content"> |
| <pre class="highlightjs highlight"><code>FROM fedora:30 |
| |
| RUN dnf update -y && dnf install -y nodejs htop && node -v |
| |
| RUN mkdir /home/user |
| |
| ENV HOME=/home/user |
| |
| RUN mkdir /projects \ |
| && chmod -R g+rwX /projects \ |
| && chmod -R g+rwX "${HOME}" |
| |
| ENTRYPOINT ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}</code></pre> |
| </div> |
| </div> |
| </li> |
| </ul> |
| </div> |
| <div class="sect3"> |
| <h4 id="_using_a_wrapper_script"><a class="anchor" href="#_using_a_wrapper_script"></a>Using a wrapper script</h4> |
| <div class="paragraph"> |
| <p>Some images use a wrapper script to configure permissions inside the container. The Dockertfile <code>ENTRYPOINT</code> command defines this script, which executes the main process defined in the <code>CMD</code> command of the Dockerfile.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Eclipse Che uses images with a wrapper script to provide permission configurations to different infrastructures protected by advanced security. OpenShift Container Platform is an example of such an infrastructure.</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Example of a wrapper script:</p> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="highlightjs highlight"><code class="language-bash hljs" data-lang="bash">#!/bin/sh |
| |
| set -e |
| |
| export USER_ID=$(id -u) |
| export GROUP_ID=$(id -g) |
| |
| if ! whoami >/dev/null 2>&1; then |
| echo "${USER_NAME:-user}:x:${USER_ID}:0:${USER_NAME:-user} user:${HOME}:/bin/sh" >> /etc/passwd |
| fi |
| |
| # Grant access to projects volume in case of non root user with sudo rights |
| if [ "${USER_ID}" -ne 0 ] && command -v sudo >/dev/null 2>&1 && sudo -n true > /dev/null 2>&1; then |
| sudo chown "${USER_ID}:${GROUP_ID}" /projects |
| fi |
| |
| exec "$@"</code></pre> |
| </div> |
| </div> |
| </li> |
| <li> |
| <p>Example of a Dockerfile with a wrapper script:</p> |
| <div class="listingblock"> |
| <div class="title">Dockerfile example</div> |
| <div class="content"> |
| <pre class="highlightjs highlight"><code>FROM alpine:3.10.2 |
| |
| ENV HOME=/home/theia |
| |
| RUN mkdir /projects ${HOME} && \ |
| # Change permissions to let any arbitrary user |
| for f in "${HOME}" "/etc/passwd" "/projects"; do \ |
| echo "Changing permissions on ${f}" && chgrp -R 0 ${f} && \ |
| chmod -R g+rwX ${f}; \ |
| done |
| |
| ADD entrypoint.sh /entrypoint.sh |
| |
| ENTRYPOINT [ "/entrypoint.sh" ] |
| CMD ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}</code></pre> |
| </div> |
| </div> |
| <div class="exampleblock"> |
| <div class="content"> |
| <div class="ulist"> |
| <div class="title">Explanation:</div> |
| <ul> |
| <li> |
| <p>The container launches the <code>/entrypoint.sh</code> script defined in the <code>ENTRYPOINT</code> command of the Dockerfile.</p> |
| </li> |
| <li> |
| <p>The script configures the permissions and executes the command using <code>exec $@</code>.</p> |
| </li> |
| <li> |
| <p><code>CMD</code> is the argument for <code>ENTRYPOINT</code>, and the <code>exec $@</code> command calls <code>${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}</code>.</p> |
| </li> |
| <li> |
| <p>The remote plug-in endpoint then starts in the container after permission configuration.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="defining-a-launch-remote-plug-in-endpoint-in-a-meta-yaml-file_che"><a class="anchor" href="#defining-a-launch-remote-plug-in-endpoint-in-a-meta-yaml-file_che"></a>Defining a <code>launch</code> remote plug-in endpoint in a <code>meta.yaml</code> file</h3> |
| <div class="paragraph"> |
| <p>Use this method to re-use images for starting a remote plug-in endpoint without any modifications.</p> |
| </div> |
| <div class="paragraph"> |
| <div class="title">Procedure</div> |
| <p>Modify the plug-in <code>meta.yaml</code> file properties <code>command</code> and <code>args</code>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><code>command</code> - Eclipse Che uses the <code>command</code> properties to override the <code>Dockerfile#ENTRYPOINT</code> value.</p> |
| </li> |
| <li> |
| <p><code>args</code> - Eclipse Che uses uses the <code>args</code> properties to override the <code>Dockerfile#CMD</code> value.</p> |
| </li> |
| <li> |
| <p>Example of a YAML file with the <code>command</code> and <code>args</code> properties modified:</p> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">apiVersion: v2 |
| category: Language |
| description: "Typescript language features" |
| displayName: Typescript |
| firstPublicationDate: "2019-10-28" |
| icon: "https://www.eclipse.org/che/images/logo-eclipseche.svg" |
| name: typescript |
| publisher: che-incubator |
| repository: "https://github.com/Microsoft/vscode" |
| title: "Typescript language features" |
| type: "VS Code extension" |
| version: remote-bin-with-override-entrypoint |
| spec: |
| containers: |
| - image: "example/fedora-for-ts-remote-plugin-without-endpoint:latest" |
| memoryLimit: 512Mi |
| name: vscode-typescript |
| command: |
| - sh |
| - -c |
| args: |
| - ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE} |
| extensions: |
| - "https://github.com/che-incubator/ms-code.typescript/releases/download/v1.35.1/che-typescript-language-1.35.1.vsix"</code></pre> |
| </div> |
| </div> |
| </li> |
| <li> |
| <p>Modify <code>args</code> instead of <code>command</code> to use an image with a wrapper script pattern and to keep a call of the <code>entrypoint.sh</code> script:</p> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">apiVersion: v2 |
| category: Language |
| description: "Typescript language features" |
| displayName: Typescript |
| firstPublicationDate: "2019-10-28" |
| icon: "https://www.eclipse.org/che/images/logo-eclipseche.svg" |
| name: typescript |
| publisher: che-incubator |
| repository: "https://github.com/Microsoft/vscode" |
| title: "Typescript language features" |
| type: "VS Code extension" |
| version: remote-bin-with-override-entrypoint |
| spec: |
| containers: |
| - image: "example/fedora-for-ts-remote-plugin-without-endpoint:latest" |
| memoryLimit: 512Mi |
| name: vscode-typescript |
| args: |
| - sh |
| - -c |
| - ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE} |
| extensions: |
| - "https://github.com/che-incubator/ms-code.typescript/releases/download/v1.35.1/che-typescript-language-1.35.1.vsix"</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Eclipse Che calls the <code>entrypoint.sh</code> wrapper script defined in the <code>ENTRYPOINT</code> command of the Dockerfile. The script executes <code>[ ‘sh’, ‘-c”, ‘ ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}’ ]</code> using the <code>exec “$@”</code> command.</p> |
| </div> |
| </li> |
| </ul> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| <div class="ulist"> |
| <div class="title">By modifying the <code>command</code> and <code>args</code> properties of the <code>meta.yaml</code> file, a user can:</div> |
| <ul> |
| <li> |
| <p>Execute a service at a container start</p> |
| </li> |
| <li> |
| <p>Start a remote plug-in endpoint</p> |
| </li> |
| </ul> |
| </div> |
| <div class="olist arabic"> |
| <div class="title">To make these actions run at the same time:</div> |
| <ol class="arabic"> |
| <li> |
| <p>Start the service.</p> |
| </li> |
| <li> |
| <p>Detach the process.</p> |
| </li> |
| <li> |
| <p>Start the remote plug-in endpoint.</p> |
| </li> |
| </ol> |
| </div> |
| </td> |
| </tr> |
| </table> |
| </div> |
| </div> |
| </div> |
| </div> |
| </article> |
| </div> |
| </main> |
| </div> |
| <footer class="footer"> |
| <div><a href="https://www.eclipse.org" target="_blank">Eclipse Foundation</a> | |
| <a href="https://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a> | |
| <a href="https://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a> | |
| <a href="https://www.eclipse.org/legal/epl-2.0/" target="_blank">Eclipse Public License</a> | |
| <a href="https://www.eclipse.org/legal" target="_blank">Legal Resources</a></div> |
| </footer> |
| |
| <script src="../../../_/js/site.js"></script> |
| <script async src="../../../_/js/vendor/highlight.js"></script> |
| </body> |
| </html> |