мод go: не удается найти модуль, предоставляющий пакет

#go #go-modules

#Вперед #go-модули

Вопрос:

Я создаю проект go с версией 1.12.1. При запуске GOPATH="$(pwd)/vendor:$(pwd)" GOBIN="$(pwd)/bin" go clean я получаю следующую ошибку:

 can't load package: package github.com/marvincaspar/go-example: unknown import path "github.com/marvincaspar/go-example": cannot find module providing package github.com/marvincaspar/go-example
  

Это только для go clean , go run или go build работает нормально.

Вот структура папок основного кода:

 .
├── Makefile
├── cmd
│   └── server
│       └── main.go
├── go.mod
├── go.sum
└── pkg
    └── storage
        └── mysql
            └── storage.go
  

Вот как go.mod выглядит файл:

 module github.com/marvincaspar/go-example
go 1.12

require (
    github.com/go-sql-driver/mysql v1.4.1
)
  

И, наконец main.go , файл:

 package main

import (
    "fmt"
    "os"

    "github.com/marvincaspar/go-example/pkg/storage/mysql"
)

func main() {
    if err := run(); err != nil {
        fmt.Fprintf(os.Stderr, "%v", err)
        os.Exit(1)
    }
}

func run() error {
    // init storage
    s := mysql.NewStorage()
    // do some other stuff...
}

  

Есть идеи, что я делаю не так?

Комментарии:

1. Вы либо делаете go modules, либо GOPATH. Если вы хотите создавать модули, лучше всего принудительно создавать модули с GO111MODULE=on . Ваш GOPATH выглядит подозрительно, возможно, вам следует переключиться на модули. Такие ошибки часто представляют собой крошечную опечатку; тройная проверка.

2. Я уже установил по умолчанию для GO111MODULE значение on .

3.Вы должны четко описать, что приводит только go clean к этой ошибке. И если вы делаете сборку модуля, не отвлекайтесь на разговоры о GOPATH или GOBIN. Также обратите внимание, что go clean сбой при запуске из каталога без исходного кода (github.com/golang/go/issues/31002 ) . Где вы запускаете go clean? Кажется, все работает нормально, и вы пытаетесь очистить где-нибудь, где ничего не нужно чистить.

4. Я не совсем уверен, в чем заключается цель, но вы почти наверняка не GOPATH должны включать vendor directory ( GOPATH="$(pwd)/vendor:$(pwd)" ) .

Ответ №1:

Обычно я использую go get и go mod tidy для того же. Он работает постоянно.

 go mod tidy
  

Комментарии:

1. Этот ответ точен. Просто чтобы добавить некоторые дополнительные детали из документации здесь . go mod tidy гарантирует, что файл go.mod соответствует исходному коду в модуле. Он добавляет все недостающие требования к модулю, необходимые для сборки пакетов и зависимостей текущего модуля, и удаляет требования к модулям, которые не предоставляют никаких соответствующих пакетов. Он также добавляет любые недостающие записи в go.sum и удаляет ненужные записи.

Ответ №2:

Обычно этот новый подход к проекту работает для меня:

 go mod init <project_name>
go test
  

Я обнаружил, что разработка проектов за пределами GOROOT и GOPATH намного проще

Ответ №3:

Go build / install пытается найти основной пакет в вашем корневом каталоге, в вашем случае он не проверяет подкаталоги (cmd / server). Следовательно, вы получаете ошибку package not found.

Чтобы правильно построить свой код, вы можете запустить:

 go build github.com/marvincaspar/go-example/cmd/server
  

Аналогично, для запуска вашего проекта вам нужно будет указать module-name / main-package-path:

 go run github.com/marvincaspar/go-example/cmd/server
  

Go clean можно выполнить таким же образом, указав module-name / path-with-main-package

 go clean github.com/marvincaspar/go-example/cmd/server
  

или

 GOPATH="$(pwd)/vendor:$(pwd)" GOBIN="$(pwd)/bin" go clean github.com/marvincaspar/go-example/cmd/server 
  

Однако, согласно https://blog .learngoprogramming.com/code-organization-tips-with-packages-d30de0d11f46 , просто поместите исходные файлы в корневой каталог вашего проекта. Так будет лучше.

Комментарии:

1. Что вам нужно изменить, если github.com/name изменения? (Т.Е. для чего-то, что вы раздвоили?)

Ответ №4:

Чтобы решить эту проблему, вам нужно сделать несколько вещей, сначала перейдите в каталог проекта с помощью Terminal , а затем выполните следующую команду (если вы используете git clone, перейдите в папку каталога clone через терминал и выполните следующую команду):

Шаг 1: sudo go mod init your-program.go

Шаг 2: sudo go mod tidy

Шаг 3: sudo go build your-program.go

Ответ №5:

Это также может произойти, если вы используете рабочие пространства. Похоже, вы не можете использовать один пакет без рабочих пространств, если используете другие с рабочими пространствами.

Поэтому попробуйте зайти в рабочее пространство верхнего уровня и выполнить

go work use ./problemPackage .

По крайней мере, это сработало для меня.