How do I properly use go modules in vscode?
Asked Answered
L

4

12

I have used vscode 1.41.1 on my mac for a few months and it worked good until I started to use go modules for dependency management. At the moment I am rewriting a simple tool and introduce packages for separate functionalities.

My code structure looks like this:

├── bmr.go -> package main & main(), uses below packages
├── check
│   ├── check.go -> package check
│   └── check_test.go
├── go.mod
├── go.sum
├── push
│   ├── push.go -> package push
│   └── push_test.go
└── s3objects
    ├── s3objects.go -> package s3objects
    └── s3objects_test.go

My go.mod file:

module github.com/some-org/business-metrics-restore

go 1.13

require (
        github.com/aws/aws-sdk-go v1.28.1
        github.com/go-redis/redis v6.15.6+incompatible
        github.com/sirupsen/logrus v1.4.2
        github.com/spf13/viper v1.6.1
        github.com/stretchr/testify v1.4.0
        golang.org/x/sys v0.0.0-20200113162924-86b910548bc1
)

All is fine when I invoke go test/run/build commands from the shell. But when I use 'Debug' -> 'Run Without Debugging' I get:

go: finding github.com/some-org/business-metrics-restore/push latest
go: finding github.com/some-org/business-metrics-restore latest
go: finding github.com/some-org/business-metrics-restore/check latest
go: finding github.com/some-org/business-metrics-restore/s3objects latest
build command-line-arguments: cannot load github.com/some-org/business-metrics-restore/check: module github.com/some-org/business-metrics-restore@latest found (v0.0.0-20191022092726-d1a52439dad8), but does not contain package github.com/some-org/business-metrics-restore/check
Process exiting with code: 1

My code currently is in a feature branch and d1a52439dad8 is the first (init) and only commit on master. No code for the tool (incl. 3 mentioned non main packages) is in the master branch. The problem here is that for some reason as you see above vscode fetches state from master and I cannot override this behaviour.

Can anyone help me?

Thanks!

Best Regards, Rafal.

Lorrimor answered 14/1, 2020 at 11:13 Comment(0)
S
23

I realized that if the go.mod is not at the root of your project VSCode does not work properly. I have an AWS SAM project with the following structure:

├── Makefile
├── README.md
├── nic-update
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   ├── main_test.go
│   └── r53service
│       └── r53.go
├── samconfig.toml
└── template.yaml

and the only way it works if by starting VSCode from the nic-update directory.

My go.mod has the following content:

require (
    github.com/aws/aws-lambda-go v1.13.3
    github.com/aws/aws-sdk-go v1.32.12
)

module github.com/jschwindt/ddns-route53/nic-update

go 1.14
Shashaban answered 1/7, 2020 at 0:14 Comment(1)
To further clarify what Juan just said, the root directory of a Go project is the one that has main.go file. I got this error too when I open the parent folder of the folder that contains main.go with VSCode, so VSCode got confused. In the example above, if we open nic-update using VSCode, we will not get into the error.Szabadka
C
22

I realized that if the go.mod is not at the root of your project VSCode does not work properly

That might now (Oct. 2020) be supported, as a consequence of gopls v0.5.1 and its experimental feature Multi-module workspace support from the proposal 32394.

Even if you don't have multiple modules, a go.mod in a sub-folder (instead of the root folder of your project) will be better managed (if you activate the gopls.experimentalWorkspaceModule setting).


As noted by kayochin in the comments:

Cleland answered 6/10, 2020 at 6:10 Comment(3)
had to restart vscode but it removed all the reds i had. ThanksMigrate
The setting should be "gopls": {"build.experimentalWorkspaceModule": true}. For those who are interested in the docs of full settings, here is the link github.com/golang/tools/blob/master/gopls/doc/…Masticatory
@Masticatory Thank you for this comment. I have included yours in the answer for more visibility.Cleland
L
6

I have also had trouble with VS Code and modules. The current status of VS Code support for Go Modules is kept up to date here: https://github.com/golang/vscode-go#Set-up-your-environment

In that link they suggest ditching most of the existing extensions VS Code encourages you to install with Go and instead using the language server gopls with these directions:

Add the below in your settings to use it.

"go.useLanguageServer": true

Note: You will be prompted to install the latest stable version of gopls as and when the Go tools team tag a new version as stable.

You should also fix autoimporting:

Add the setting "go.formatTool": "goimports" and then use Go: Install/Update Tools to install/update goimports as it has recently added support for modules.

When you do these things, keep in mind that you'll also lose a couple of features:

  • Completion of unimported packages doesnt work

  • Find references and rename only work in a single package

Languor answered 16/1, 2020 at 17:20 Comment(0)
B
0

If the go.mod is not at the root of your project then starting from go 1.18 version you can create go.work file which handles the problem.

Example:


parent
    ├── child1
    │   ├── go.mod
    │   └── main.go
    └── child2

If you want to run child1 module from parent directory, create go.work in the parent directory:

go work init

Use child1 module:

go work use child1

Then try to run code from parent.

Breen answered 13/3 at 10:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.