blob: 805b292065c2956abf6bb0b04387291a391d3c99 [file] [log] [blame] [view]
# Advanced topics
This document describes more advanced ways of working with the VS Code Go
extension.
## Choosing a different version of Go
The extension chooses the `go` command using the `PATH` (or `Path`) environment
variable by default. You can configure the extension to choose a different
version of `go` with one of the following options.
* (Preferred) Adjust your `PATH` or `Path` environment variable, and *open VS
Code with the adjusted environment* variable, or
* Use the Go extension's `"Go: Choose Go Environment"` command that opens a
[menu](ui.md) to change the `go` version, or
* Use the `"go.alternateTools"` settings and specify the absolute path to the
`go` command. `"go.alternateTools": { "go": "/path/to/go/command" }`
**note**: For historical reasons, some users configure the `"go.goroot"`
settings or the `GOROOT` environment variable to select the Go SDK location.
With recent versions of Go, that's unnecessary in most cases.
## Configuring the installation of command-line tools
The `Go: Install/Update Tools` command uses the `go get` command to download and
install requested tools. By default, `go get` will install the compiled tools in
one of the following directories.
* the directory the `GOBIN` environment variable specifies, or
* the `bin` directory under the first `GOPATH` (or `"go.gopath"`) directory, or
* the `$HOME/go/bin` (or `$USERPROFILE/go/bin`) directory.
Some users prefer to choose a different installation location. In that case, use
the `"go.toolsGopath"` setting.
The extension finds the required tools by their names (`go`, `gopls`, `dlv`,
etc.). The `"go.alternateTools"` setting provides a way to configure the
extension to use different tool location, for example a wrapper with a different
name.
## Using a custom linter
A commonly customized feature is the linter, which is the tool used to provide
coding style feedback and suggestions. This extension supports linters such as
`staticcheck`, `golangci-lint`, and `revive`. You can choose one of them using
the `"go.lintTool"` setting. For customization of the linter, please consult the
linter's documentation.
Note that if you are using `staticcheck`, you can enable it to run within
`gopls` by setting `"gopls": { "ui.diagnostic.staticcheck": true }`.
## Working on the Go standard library and the Go tools
This extension can be used for developing the standard library with additional
configuration.
First, you **must open the `src/` folder in VS Code**, not the Go tree root.
(See [golang/go#32394](https://github.com/golang/go/issues/32394).)
Then, you need to configure the workspace, by placing the following in
`src/.vscode/settings.json`. [Command Palette] ->
`Preferences: Open Workspace Settings (JSON)` will open the settings file.
```json5
{
// Use the local go tool. This needs to be built with make.bash.
"go.alternateTools": {
"go": "~/godev/bin/go"
},
//
// Below is optional.
//
// Build a separate set of tools. For golang/vscode-go#294.
"go.toolsGopath": "~/.vscode/godev",
// Don't reformat HTML files since we have a custom style.
"html.format.enable": false
}
```
The above assumes the Go tree is checked out at `~/godev`. If your Go tree is
somewhere else, modify `go.alternateTools.go` to point to the go *binary*
accordingly. Many underlying tools including `gopls` invoke the go command
(`go list`, etc), so we assume the binary isn't completely broken.
You can add `.vscode` to `.git/info/exclude` to avoid risking checking
`settings.json` into git.
If you see an "inconsistent vendoring" error, please report it at
[golang/go#40250](https://github.com/golang/go/issues/40250).
## Formatting Code and Organizing Imports
When you have multiple formatter extensions, be sure to set this
extension as the default formatter for go language.
```json5
"[go]": {
"editor.defaultFormatter": "golang.go"
}
```
Formatting and organizing imports are enabled by default. You
can choose to disable them by configuring the following settings.
```json5
"[go]": {
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.organizeImports": false
}
}
```
[Command Palette]: https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette