Skip to content

Latest commit

 

History

History
97 lines (70 loc) · 5.04 KB

File metadata and controls

97 lines (70 loc) · 5.04 KB

Building the VS Code Extension Locally

Prerequisites

  • npm and vsce
  • PowerShell Core (6.0 or later)
  • .NET Core SDK 3.1 or later

Obtaining npm and vsce

All Visual Studio Code extensions require a local install of the Node Package Manager to work. NPM is distributed with Node.js, which can be obtained from https://nodejs.org/en/, or using Chocolatey:

choco install nodejs

Once you have NPM, we strongly suggest installing the VS Code Extension (vsce) tool:

npm i -g vsce

Here, npm i -g instructs NPM to install globally the vsce package. After doing so, vsce can be used from the command line.

Steps

Before doing any local development, you will need to run bootstrap.ps1 to set version numbers and other metadata for the Quantum Development Kit. Please see the root README for more information.

As of version 0.10 of the Quantum Development Kit, the Visual Studio Code extension no longer includes the Q# language server, but downloads a copy of the server at runtime. This process is controlled by metadata stored in package.json, which is in turn generated from package.json.v.template when running bootstrap.ps1 in the root of the repository. For instance, when developing against 0.10.1910.3002, bootstrap.ps1 will create a blobs section in package.json similar to the following:

"blobs": {
    "win32": {
        "url": "https://msquantumpublic.blob.core.windows.net/qsharp-compiler/QsLanguageServer-win10-x64-0.0.1910.1532.zip",
        "sha256": "<DISABLED>"
    },
    "darwin": {
        "url": "https://msquantumpublic.blob.core.windows.net/qsharp-compiler/QsLanguageServer-osx-x64-0.0.1910.1532.zip",
        "sha256": "<DISABLED>"
    },
    "linux": {
        "url": "https://msquantumpublic.blob.core.windows.net/qsharp-compiler/QsLanguageServer-linux-x64-0.0.1910.1532.zip",
        "sha256": "<DISABLED>"
    }
}

Here, the <DISABLED> value for hashes instructs the Visual Studio Code extension to suppress checking SHA256 sums of downloaded blobs, as these hashes are injected by the Quantum Development Kit build process at release time. If no released version of the Q# language server has been published matching the version number injected by bootstrap.ps1, then downloading the language server will fail when running the extension.

For local development of the extension, however, it is typically more convenient to suppress downloading the Q# language server at all, and to use a local development version of the server instead. If the quantumDevKit.languageServerPath preference is set either in your Visual Studio Code user preferences or in your folder or workspace settings, then the executable at that path will be used in preference to downloading a copy of the Q# language server, and no attempt will be made to ensure that the executable at that path matches the extension version.

You can build a self-contained version of the language server for use in local development using the dotnet publish command (replace your --runtime argument as needed):

PS> cd ../QsCompiler/LanguageServer
PS> dotnet publish --self-contained --runtime win10-x64

To get the value that you need for the quantumDevKit.languageServerPath preference:

PS> Resolve-Path bin/Debug/netcoreapp3.1/win10-x64/publish/Microsoft.Quantum.QsLanguageServer.exe

Debugging

As an alternative to using vsce package to produce an installable VSIX, the VS Code extension can be run in an experimental instance of VS Code. From the Debug tab in VS Code, ensure that "Extension" is selected in the Debug target menu and press the green ‣.

If you would like to also debug the language server at the same time, this can be done using the ".NET Core Attach" debugging target along with the "Extension" target. Set a breakpoint in languageServer.ts that will let you intercept the language server executable before any calls are made from the client. For instance, breaking at the second line below will let you observe the PID used to attach the .NET Core debugger and will prevent any calls from the client to the server until you resume the extension:

.then((childProcess) => {
    console.log(`[qsharp-lsp] started Q# Language Server as PID ${childProcess.pid}.`);
})

Once you reach this breakpoint, start a ".NET Core Attach" debugging session and select the PID that you observe in the above snippet. Change back to the "Extension" debugger and resume.

Common Problems

Semver Issues

You may see an error when packaging or debugging the VS Code extension indicating that the package is not semver compatible. This indicates that the build script bootstrap.ps1 did not produce a SemVer 2.0–compatible version number when writing package.json from package.json.v.template, typically due to a mis-set environment variable. If this happens, correct the environment variables used by bootstrap.ps1 or manually edit the version property of package.json (note that any such manual edits will be overwritten by calls to bootstrap.ps1 and will not be saved in the repo).