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


81

Я випробовую нову систему модулів 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

2
Привіт, Девід, якщо ти вважаєш, що моя відповідь відповідає на твоє запитання, подумай позначати це як відповідь. Дякую!
Halil Kaskavalci

плагін maven golang, оскільки 2.3.3 також дозволяє працювати з локальними модулями (він автоматично додає локальні шляхи під час збірки), ви можете поглянути на приклад github.com/raydac/mvn-golang/tree/master/mvn-golang- приклади /…
Ігор Мазниця

Відповіді:


52

Я настійно рекомендую вам скористатися інструментарієм go, який негайно вирішує ці проблеми. Код Visual Studio з плагіном vscode-go дуже корисний.

Проблема тут полягає в тому, що Go вимагає відносних шляхів щодо вашого оператора $GOPATH/srcабо moduleв імпорті. Залежно від того, де ви знаходитесь GOPATH, шлях імпорту повинен включати і це. У цьому випадку оператор імпорту повинен містити шлях модуля go уgo.mod

ГОПАТ

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

$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 - я повинен слідувати шаблону vgo, де я починаю шлях до інструкції імпорту з імені модуля. Дякую!
Девід Алш

15
Стривай, я розгублений. Якщо мій модуль знаходиться десь у моїй файловій системі, як його знаходить система модулів?
Нарфанатор,

1
Якщо ви знаходитесь всередині модуля, він знаходить пакети в тому самому модулі, використовуючи шлях імпорту пакета та розташування go.modфайлу на диску, якщо шляхи імпорту є повними шляхами імпорту, які починаються з імені модуля (наприклад, import "github.com/my/module/pkg"`) . Якщо ви хочете знайти пакети в інших модулях, які знаходяться в іншому місці на вашому диску, тоді саме тут надходить директива replace . Ця відповідь охоплює більше про структуру модулів та шляхи імпорту.
типовий182

6
Чому всі продовжують використовувати формати url? Питання було дуже чітким: localmodule / localmodule.go, все. Чому тут githubs і example.com?
Холмс

@holms відповідь і коментар вище вашого пояснюють це, але для уточнення мова не має механізму пошуку внутрішніх пакетів, а лише інструмент go. інструмент go залежить від GOPATH або конфігурації модуля (go.mod). ви, по суті, використовуєте можливість інструментів go для обробки ваших локальних пакетів так само, як і для будь-якого іншого типу пакетів . див. також деякі інші відповіді на це питання.
user4893106

115

Дозвольте мені визначити це спочатку modulesколекції packages. У Go 11 я використовую модулі go як нижче:

Якщо обидва пакети знаходяться в одному проекті, ви можете просто зробити наступне: In go.mod:

module github.com/userName/moduleName

і всередині вашого main.go

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

Однак, якщо це окремі модулі, тобто різні фізичні шляхи, і ви все одно хочете імпортувати local, 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


3
OMG ця відповідь мені так допомогла. Дякую :)
Адіс Азхар

2
Я використав go.mod, що містить лише директиву replace, директива require не потрібна для побудови проекту.
mh-cbon

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.