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, но это не могло это исправить.

Мое решение:

  1. Обновление для использования 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' вопрос.

  2. Тогда я получил еще одну проблему go: cannot use path@version syntax in GOPATH mode,

    который может быть решен настройкой env GO111MODULE=on

У меня была такая же проблема, и она была "почти" решена напрямую. Сначала не получилось. Это произошло потому, что модуль уже был инициализирован, и я выполнил команду "go get..." до того, как установил GO111MODULE=on.

Чтобы заставить его работать, я удалил "go.mod" и повторно инициализировал мод, запустив "go modinit..." и повторно запустив необходимые команды "go get....".

Другие вопросы по тегам