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

Я создаю проект 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...
}

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


person Marvin Caspar    schedule 11.04.2019    source источник
comment
Вы либо идете модулями, либо GOPATH. Если вы хотите создавать модули, лучше всего запускать сборку модулей с GO111MODULE = on. Ваш GOPATH выглядит подозрительно, может, стоит переключиться на модули. Такие ошибки часто представляют собой крошечные опечатки; тройной чек.   -  person Volker    schedule 11.04.2019
comment
Я уже включил GO111MODULE по умолчанию.   -  person Marvin Caspar    schedule 11.04.2019
comment
Вы должны четко описать, что только go clean приводит к этой ошибке. И если вы делаете сборку модуля, не отвлекайтесь на разговоры о GOPATH или GOBIN. Также обратите внимание, что go clean не работает при запуске из каталога без исходного кода (github.com/golang/go/ issues / 31002). Куда ты бежишь, убирайся? Кажется, все работает нормально, и вы пытаетесь очистить место, где чистить нечего.   -  person Volker    schedule 11.04.2019
comment
Я не совсем уверен, что это за намерение, но вам почти наверняка не следует устанавливать GOPATH для включения каталога vendor (GOPATH="$(pwd)/vendor:$(pwd)").   -  person typical182    schedule 01.08.2019


Ответы (3)


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

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

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

Точно так же для запуска вашего проекта вам нужно будет указать имя-модуля / путь-основного-пакета:

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

Go clean можно выполнить таким же образом, указав имя-модуля / путь-с-основным-пакетом

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

or

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, просто поместите исходные файлы в корень вашего проекта. Так лучше.

person ShailyAggarwal    schedule 11.04.2019

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

go mod init <project_name>
go test

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

person Nicholas Fernandes Paolillo    schedule 24.11.2020

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

go mod tidy
person BITSSANDESH    schedule 16.06.2021