Доступ к локальным пакетам в модуле 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-адрес, даже если его нет. Потому что:

  1. Это упрощает включение, поскольку независимо от того, где находится ваш файл, при импорте используется один и тот же URL-адрес (код остается неизменным, даже если файлы перемещаются!)
  2. У вас могут быть пакеты с конфликтами имен. Так google.com/go-api/user не противоречит определениям your.org/internal/user
  3. Когда-нибудь вы можете опубликовать 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()
}

это должно работать

Другие вопросы по тегам