Go модули установки Go инструменты
Я использую модули go в качестве управления зависимостями, и у меня возникла проблема с установкой чего-то подобного:
go get -u github.com/go-critic/go-critic/...
результат сверху был:
go: cannot find main module; see 'go help modules'
8 ответов
Если GO111MODULE
вар должен on
, вы должны быть внутри инициализированного дерева каталогов модуля Go, чтобы использовать go get
, даже если вы пытаетесь получить инструмент, а не новую зависимость. Это известная и широко обсуждаемая проблема:
https://github.com/golang/go/issues/27643
https://github.com/golang/go/issues/24250
https://github.com/golang/go/issues/25922
Краткосрочное решение - запустить GO111MODULE=off go get <tool>
, Это явно отключает поддержку модуля, даже если вы в данный момент находитесь в пакете модуля, и вынуждает его использовать только GOPATH.
В долгосрочной перспективе выяснить, что является лучшим решением для поддержки установки инструмента через go get
(или другая команда, например go install
с флагом) является постоянной областью обсуждения с небольшим количеством на пути к установленному консенсусу пока. Тем не менее, есть открытый PR для Go 1.12, который, если он будет принят, позволит go get
просто работать вне модуля, даже с GO111MODULE=on
задавать.
Некоторые из других ответов здесь устарели на данный момент.
Следует рассмотреть как минимум два случая:
Случай 1
Вы хотите установить инструмент, но не хотите изменять текущий go.mod
чтобы отслеживать этот инструмент как зависимость.
Короче говоря, с Go 1.12 или 1.13 самое простое решение - cd
в каталог без go.mod
, Такие как:
$ cd /tmp
$ go get github.com/some/tool@v1.0.1
В качестве альтернативы gobin - это команда с поддержкой модуля для установки или запуска двоичных файлов, которая обеспечивает дополнительную гибкость, включая возможность установки без изменения текущего модуля.go.mod
См. Этот связанный ответ для получения дополнительных сведений, включая решение для Go 1.11, а также возможную новую опцию в Go 1.14 для получения инструмента без его обновления вашегоgo.mod
.
Случай 2
С другой стороны, если вы хотите явно отслеживать инструмент как версионную зависимость в вашем go.mod
, затем см. "Как я могу отслеживать зависимости инструментов для модуля?" FAQ по модулям вики.
Короче говоря, вы создаете tools.go
файл в отдельном пакете и установите // +build tools
тег сборки, например:
// +build tools
package tools
import (
_ "golang.org/x/tools/cmd/stringer"
)
Операторы импорта позволяют go
команда для точной записи информации о версии для ваших инструментов в вашем модуле go.mod
, в то время как // +build tools
Ограничение сборки не позволяет обычным сборкам фактически импортировать ваши инструменты.
Я столкнулся с той же проблемой и решил ее с помощью приведенной ниже команды.
$ go env -w GO111MODULE=авто
С Go 1.12 (февраль 2019), GO111MODULE=on go get
буду работать.
(Из номера 24250)
Модули
когда
GO111MODULE
установлен вon
,go
Теперь команда поддерживает операции с поддержкой модулей вне каталога модуля, при условии, что этим операциям не нужно разрешать пути импорта относительно текущего каталога или явно редактироватьgo.mod
файл.
Такие команды какgo get
,go list
, а такжеgo mod download
вести себя как будто в модуле с изначально пустыми требованиями.
В этом режимеgo env GOMOD
сообщает о нулевом устройстве системы (/dev/null
или жеNUL
).
go
Команды, которые загружают и извлекают модули, теперь безопасно вызывать одновременно.
Кеш модуля (GOPATH/pkg/mod
) должен находиться в файловой системе, которая поддерживает блокировку файлов.Директива go в
go.mod
файл теперь указывает версию языка, используемого файлами в этом модуле, иgo mod tidy
устанавливает текущую версию (переход 1.12), если существующая версия отсутствует.
Если директива go для модуля указывает версию, более новую, чем используемая цепочка инструментов,go
Команда попытается собрать пакеты независимо, и заметит несоответствие, только если эта сборка не удалась.
Попробуйте эту командуGO111MODULE=on go get -u github.com/go-critic/go-critic/...
У меня тоже была такая ошибка, но я решил ее, запустив vsc от имени администратора, чтобы он мог установить модули.
Это сработало для меня, не делая ничего лишнего :)
Просто была такая же проблема на go1.11.2. Пытался установить GO111MODULE=on
, но это не могло это исправить.
Мое решение:
Обновление для использования go 1.12.5: https://golang.org/doc/install?download=go1.12.5.linux-amd64.tar.gz
Это может решить
go: cannot find main module; see 'go help modules'
вопрос.Тогда я получил еще одну проблему
go: cannot use path@version syntax in GOPATH mode
,который может быть решен настройкой env
GO111MODULE=on
У меня была такая же проблема, и она была "почти" решена напрямую. Сначала не получилось. Это произошло потому, что модуль уже был инициализирован, и я выполнил команду "go get..." до того, как установил GO111MODULE=on.
Чтобы заставить его работать, я удалил "go.mod" и повторно инициализировал мод, запустив "go modinit..." и повторно запустив необходимые команды "go get....".