Доступ к локальным пакетам в модуле go (go 1.11)
Я пробую новую систему модулей Go и у меня проблемы с доступом к локальным пакетам. Следующий проект находится в папке на моем рабочем столе за пределами моего gopath.
Моя структура проекта выглядит так:
/
- /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
4 ответа
Позвольте мне сначала определить это 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"
Вот нежное введение в модули Голанга
Я настоятельно рекомендую вам использовать Go Toolchain, который решает эти проблемы из коробки. Visual Studio Code с плагином vscode-go действительно полезен.
Проблема здесь в том, что Go требует относительных путей по отношению к вашему $GOPATH/src
или же module
в заявлении на импорт. В зависимости от того, где вы находитесь в вашем GOPATH
, путь импорта должен включать это также. В этом случае в операторе импорта должен быть указан путь модуля 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"
Как новичок, я не сразу понял принятый ответ - кстати, это здорово. Вот более короткий ответ для этих новичков!
В go модули / пакеты выражаются в виде URL-адресов, которые вы импортируете в свой код:
import your.org/internal/fancy_module
Но ждать! Мой код не по URL-адресу, что происходит?
Это умение го. Вы притворяетесь, что есть URL-адрес, даже если его нет. Потому что:
- Это упрощает включение, поскольку независимо от того, где находится ваш файл, при импорте используется один и тот же URL-адрес (код остается неизменным, даже если файлы перемещаются!)
- У вас могут быть пакеты с конфликтами имен. Так
google.com/go-api/user
не противоречит определениямyour.org/internal/user
- Когда-нибудь вы можете опубликовать URL-адрес на GitHub, и весь код будет просто работать
Это все замечательно, Эван, но как мне импортировать относительный путь?
Хороший вопрос! Вы можете импортировать, изменив свой
go.mod
файл, чтобы иметь эту строку:
module fancy_module
go 1.16
replace your.org/fancy_module => ../path/to/fancy_module
Учитывая структуру проекта Golang
/
- /platform
- platform.go
- main.go
- go.mod
Доступ к методам или структурам... и т.д. (которые являются общедоступными) из локальных пакетов /platform прост, как показано ниже .
// основной пакет main.go
import (
p "./platform"
)
func main() {
p.Print()
}
это должно работать