VSCode: не удалось импортировать пакет Golang
Я пишу проект Go внутри своего GoPath, и я использую пакет Redigo для подключения к серверу Redis. Приложение работает нормально, однако в VSCode есть эта досадная ошибка при импорте пакета, которая не позволяет VSCode выдавать предложения intellisense.
Не удалось импортировать github.com/gomodule/redigo/redis (нет данных пакета для пути импорта github.com/gomodule/redigo/redis)
Это мой VSCode settings.json
{
"editor.fontSize": 14,
"editor.formatOnPaste": true,
"editor.multiCursorModifier": "ctrlCmd",
"editor.snippetSuggestions": "top",
"extensions.ignoreRecommendations": false,
"workbench.statusBar.visible": true,
"workbench.iconTheme": "vscode-great-icons",
"files.autoSave": "afterDelay",
"go.useLanguageServer": true,
"go.alternateTools": {
"go-langserver": "bingo"
},
"go.toolsEnvVars": {
"GO111MODULE": "on"
},
"go.languageServerExperimentalFeatures": {
"autoComplete": true,
"documentSymbols": true,
"findReferences": true,
"format": true,
"goToDefinition": true,
"goToTypeDefinition": true,
"hover": true,
"signatureHelp": true,
"rename": true,
"workspaceSymbols": true,
},
"go.lintTool": "golangci-lint",
"go.lintFlags": [
"--fast",
"-E", "goimports",
"-E", "gocritic",
"-E", "gocyclo",
"-E", "gosec",
"-E", "maligned",
"-E", "scopelint",
"-E", "interfacer",
"-E", "goconst",
"-E", "unconvert",
"-E", "unparam",
"-E", "prealloc",
"-E", "varcheck",
],
"go.formatTool": "goimports",
"editor.minimap.enabled": false,
"breadcrumbs.enabled": false,
"git.autofetch": true,
"workbench.startupEditor": "newUntitledFile",
"explorer.confirmDelete": false,
"git.enableSmartCommit": true,
"git.confirmSync": false,
"window.zoomLevel": 0,
"explorer.confirmDragAndDrop": false
}
У меня уже включен параметр GO111MODULE env var, это результат go env
set GOARCH=amd64
set GOBIN=C:\Users\Francesco\Go\bin
set GOCACHE=C:\Users\Francesco\AppData\Local\go-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\Users\Francesco\Go
set GOPROXY=
set GORACE=
set GOROOT=c:\go
set GOTMPDIR=
set GOTOOLDIR=c:\go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=C:\Users\Francesco\Go\src\test\go.mod
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\FRANCE~1\AppData\Local\Temp\go-build928398422=/tmp/go-build -gno-record-gcc-switches
Что мне нужно изменить, чтобы это работало?
17 ответов
Со мной такое случается в нескольких конкретных ситуациях. Это мой процесс устранения неполадок:
Вы бежали
go get github.com/gomodule/redigo/redis
?Иногда у меня возникает аналогичная проблема, когда я открываю свой редактор в корне, отличном от моего проекта.
. <- editor open here
|
|_Folder
| main.go
Убедитесь, что ваши инструменты обновлены: запустите
ctrl
+shift
+p
, типGo
и выбралInstall/Update tools
.Попробуйте переместить свой проект из GOPATH и настроить для него go.mod.
Перезагрузите редактор
У меня была такая же проблема с другим пакетом (на Mac),
- Обновите инструменты Go -
ctrl
+shift
+p
или жеcmd
+shift
+p
и обновить / установить инструменты go - Перезапустить VScode
Проблема решена
Я столкнулся с похожей проблемой, но ситуация немного другая. Я столкнулся с этой проблемой в VSCode Remote и даже в базовой библиотеке, напримерnet/http
не может быть импортирован. Я обнаружил, что это произошло из-за некоторых синтаксических ошибок в других файлах того же пакета, напримерundefined variables
. Когда я решил эти синтаксические ошибки и перезапустил VSCode, я обнаружил, что проблема решена.
Выполнение полного перезапуска vsCode устранило проблему для меня.
Примечаниеcmd
+shift
+p
->Developer: Reload Window
НЕ исправил, только полное закрытие и повторное открытие кода VS
go mod init package_name
а затем у меня все заработало.
go mod tidy
установил пакеты и обновил файл мода.
Это сработало для меня:
- Файл/Новое окно
- Файл/Добавить папку в рабочую область...
Я столкнулся с этой проблемой, когда в одном пакете было два файла с разными именами пакетов. Например: в одном файле
package main
в то время как другой был
package app
.
Обеспечение того, чтобы все файлы имели одно и то же имя пакета, приведет к тому, что импорт всего пакета снова начнет работать.
У меня были те же симптомы. В моем случае основной причиной было отсутствие «CGO_ENABLED=1». Потому что у меня в пакете был код «C».
Я установил на Fedora 35 gcc-go, и после удаления все заработало нормально.
sudo dnf remove gcc-go
Настройка вашего рабочего пространства
gopls
поддерживает как модуль Go, так и режимы GOPATH. Однако для этого требуется определенная область, в которой должны работать языковые функции, такие как ссылки, переименование и реализация.Для настройки этой области доступны следующие параметры:
Модульный режим
Один модуль
Если вы работаете с одним модулем, вы можете открыть корень модуля (каталог, содержащий
go.mod
файл), подкаталог внутри модуля или родительский каталог, содержащий модуль.Примечание . Если вы открываете родительский каталог, содержащий модуль, он должен содержать только этот единственный модуль. В противном случае вы работаете с несколькими модулями.
Несколько модулей
В Gopls есть несколько вариантов одновременной работы с несколькими модулями, описанных ниже. Начиная с версии Go 1.18 предпочтительным решением являются рабочие области Go.
Рабочие области Go (Go 1.18+)
Начиная с Go 1.18,
go
команда имеет встроенную поддержку многомодульных рабочих пространств черезфайлы. Эти файлы распознаются gopls, начиная сgopls@v0.8.0
.Таким образом, самый простой способ работать с несколькими модулями в Go 1.18 и более поздних версиях — создать файл, содержащий модули, над которыми вы хотите работать, и установить корневой каталог рабочей области в каталог, содержащий файл.
Например, предположим, что это репо извлечено в
$WORK/tools
каталог. Мы можем работать на обоихgolang.org/x/tools
иgolang.org/x/tools/gopls
одновременно с созданиемgo.work
файл:cd $WORK go work init go work use tools tools/gopls
... с последующим открытием
$WORK
каталог в нашем редакторе.
если вы используете Go 1.18+, вот новая функция для многомодульных рабочих пространств. Как только вы настроите файл go.work в корневой папке проекта, проблем больше не будет, вы можете проверить следующие ссылки для получения более подробной информации.
Если это репозиторий, который вы извлекли из Github, и вы столкнулись с ошибкамиpackage/s could not be imported
и есть в репо, я сделал следующее, чтобы исправить:
- Откройте терминал и перейдите в корень проекта, где находится ваш
go.mod
иgo.sum
расположены и запускаются:
go mod download
В меню справки указано, что команда:downloads modules to local cache
- Внутри VS Code откройте палитру команд с любой командой, которая у вас есть для вашей архитектуры. Для моей команды на Mac я использую
control + shift + p
и искатьGo: Install/Update tools
. Нажмите Enter и обновите инструменты Go.
После этого мойmain.go
обновлен пакетами, которых мне не хватало, без явного запускаgo install thingVSCodeSaidIWasMissing
Столкнулся с той же проблемой, переустановил go с goenv, а затем запустил несколькоgo mod why
s проверить, все ли в порядке и
Я недавно столкнулся с этой же ошибкой, мое решение заключалось в том, чтобы моя версия файла мода моего проекта была той же версии, что и версия, установленная в моей системе.
у меня такая же проблема была от
go mod init packegeName
и назвал мой пакет «время», и редактор дал мне ошибку, поэтому я просто заменил его на «время», я не знаю, что происходит на самом деле, но он работает нормально
Моя проблема заключалась в том, что у меня была корневая папка ( папка My Parent), которая была родительской папкой моего проекта Go, открытой в VSCode.
то есть,
My Parent folder
My Go Project folder
Вместо открытия родительской папки ( папка My Parent) вы можете просто открыть папку проекта ( папка My Go Project)
В моем случае мне нужен был доступ к файлам в обеих папках, поэтому я добавил родительские и дочерние папки в рабочее пространство VSCode, как здесь , и это избавило от ошибок