Доступ к локальным пакетам в модуле go (go 1.11)

Я пробую новую систему модулей Go, и у меня проблемы с доступом к локальным пакетам. Следующий проект находится в папке на моем рабочем столе за пределами моего пути.

Моя структура проекта выглядит так:

/
  - /platform
      - platform.go
  - main.go
  - go.mod

// platform.go
package platform

import "fmt"

func Print() {
    fmt.Println("Hi")
}

// main.go
package main

import "platform"

func main() {
    platform.Print()
}

go build main.go говорит мне

cannot find module for path platform

person David Alsh    schedule 26.08.2018    source источник
comment
Привет, Дэвид, если вы считаете, что мой ответ отвечает на ваш вопрос, отметьте его как ответ. Спасибо!   -  person Halil Kaskavalci    schedule 25.10.2018
comment
Плагин maven golang начиная с 2.3.3 также позволяет работать с локальными модулями (он автоматически добавляет локальные пути во время сборки), вы можете взглянуть на пример github.com/raydac/mvn-golang/tree/master/mvn-golang-examples/   -  person Igor Maznitsa    schedule 31.07.2019


Ответы (2)


Я настоятельно рекомендую вам использовать набор инструментов go, который позаботится об этих проблемах из коробки. Код Visual Studio с плагином vscode-go действительно полезен.

Проблема здесь в том, что Go требует относительных путей по отношению к вашему $GOPATH/src или module в операторе импорта. В зависимости от того, где вы находитесь в своем GOPATH, путь импорта также должен включать это. В этом случае оператор импорта должен включать путь к модулю go в go.mod

GOPATH

Предположим, ваш проект находится здесь:

$GOPATH/src/github.com/myuser/myproject

Ваш путь импорта должен быть:

import "github.com/myuser/myproject/platform"

VGO

Предположим, ваш файл go.mod:

module example.com/myuser/myproject

Ваш путь импорта должен быть:

import "example.com/myuser/myproject/platform"
person Halil Kaskavalci    schedule 26.08.2018
comment
Это было удачно - в случае модулей go - я должен следовать шаблону vgo, где я начинаю путь оператора импорта с имени модуля. Спасибо! - person David Alsh; 30.10.2018
comment
Подожди, я в замешательстве. Если мой модуль находится где-то в моей файловой системе, как модульная система его находит? - person Narfanator; 02.04.2019
comment
Если вы находитесь внутри модуля, он находит пакеты в том же модуле, используя путь импорта пакета и расположение файла go.mod на диске, если пути импорта являются полными путями импорта, которые начинаются с имени модуля (например, import "github.com/my/module/pkg` ). Если вы хотите найти пакеты в других модулях, которые находятся в другом месте на вашем диске, то здесь директива replace. Этот ответ охватывает подробнее о структуре модуля и путях импорта. - person typical182; 01.08.2019
comment
Почему все продолжают использовать форматы URL? Вопрос был предельно ясным: localmodule / localmodule.go вот и все. Почему здесь есть githubs и example.com? - person holms; 28.02.2020
comment
@holms ответ и комментарий над вашим объясняют это, но, чтобы уточнить, в языке нет механизма для поиска внутренних пакетов, только инструмент go. инструмент go зависит либо от GOPATH, либо от конфигурации модуля (go.mod). вы, по сути, используете возможность инструментов go обрабатывать ваши локальные пакеты так же, как любой другой вид пакетов. см. также некоторые другие ответы на этот вопрос. - person user4893106; 08.05.2020
comment
моя проблема в том, почему модуль должен иметь _1 _... вопрос касается локальных файлов, почему ответ должен содержать URL ??? это моя проблема здесь ... сложно ли использовать путь к файлу, как другие языки программирования? или мы должны относиться ко всему как к внешнему URL-адресу? - person uberrebu; 23.04.2021
comment
Инструмент go должен знать, где найти источник. Он принимает URL по дизайну. Если вы хотите получить доступ к локальным файлам go, вы можете настроить GOPATH и получить доступ к локальным файлам в каталоге $GOPATH/src. Если вы хотите избежать GOPATH, вы можете проверить возможные обходные пути, которые можно использовать с помощью модулей. . - person Halil Kaskavalci; 25.04.2021

Позвольте мне определить, что первые modules - это коллекции packages. В Go 11 я использую следующие модули go:

Если оба пакета находятся в одном проекте, вы можете просто сделать следующее: В go.mod:

module github.com/userName/moduleName

и внутри вашего main.go

import "github.com/userName/moduleName/platform"

Однако, если они являются отдельными модулями, то есть разными физическими путями, и вы все еще хотите импортировать локальный packages, не публикуя его удаленно, например, в github, вы можете добиться этого с помощью директивы replace.

Учитывая имя модуля github.com/otherModule и platform, как вы его назвали, это единственный пакет внутри. В go.mod вашего основного модуля добавьте следующие строки:

module github.com/userName/mainModule

require "github.com/userName/otherModule" v0.0.0
replace "github.com/userName/otherModule" v0.0.0 => "local physical path to the otherModule"

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

Внутри main.go, чтобы импортировать определенный пакет, например platform из otherModule:

import "github.com/userName/otherModule/platform"

Вот мягкое введение в модули Golang.

person Muhammad Soliman    schedule 25.03.2019
comment
Боже мой, этот ответ мне очень помог. Спасибо :) - person Adis Azhar; 18.08.2019
comment
Я использовал go.mod, содержащий только директиву replace, директива require не требовалась для сборки проекта. - person mh-cbon; 26.09.2019
comment
также хороший пример: forum.golangbridge.org/t/ go-module-and-importing-local-package / - person kokemomuke; 12.02.2020
comment
Моя проблема в том, почему у модуля должен быть github.com ... вопрос касается локальных файлов, почему ответ должен содержать URL-адрес ??? это моя проблема здесь ... сложно ли использовать путь к файлу, как другие языки программирования? или мы должны относиться ко всему как к внешнему URL-адресу? - person uberrebu; 23.04.2021
comment
@uberrebu ни ​​точка, ни полное доменное имя больше не требуются в самых последних версиях Go (проверено в 1.15). Подробнее об этом читайте в обзоре этого отличное руководство. - person ripat; 02.07.2021