Организация локального кода в пакетах с использованием модулей Go - PullRequest
4 голосов
/ 31 марта 2019

Я не могу найти способ выделить какой-то код из main.go в локальный пакет при использовании модулей Go (версия go> = 1.11) за пределами $GOPATH.

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

Файл main.go:

package main

// this import does not work
import "./stuff"

func main() {
    stuff.PrintBaz()
}

Файл./stuff/bar.go (выдавая себя за локальный пакет):

package stuff

import "log"

type Bar struct {
    Baz int
}

func PrintBaz() {
    baz := Bar{42}
    log.Printf("Bar struct: %v", baz)
}

Файл go.mod (команда go mod init foo):

module foo

go 1.12

При выполнении go run main.go:

  • Если я import "./stuff", то я вижу build command-line-arguments: cannot find module for path _/home/<PATH_TO>/fooprj/stuff.
  • Если я import "stuff", то я вижу build command-line-arguments: cannot load stuff: cannot find module providing package stuff.
  • Если я import stuff "./stuff"с псевдонимом пакета, затем я снова вижу: build command-line-arguments: cannot find module for path _/home/<PATH_TO>/fooprj/stuff.

Не могу найти способ заставить локальные пакеты работать с модулями go.

  • Что не так скод выше?
  • Как я могу импортировать локальные пакеты в другой код Go внутри проекта, определенного с модулями Go (файл go.mod)?

1 Ответ

9 голосов
/ 31 марта 2019

Сначала вы должны выбрать имя для своего проекта и записать его в файл go.mod.Это имя принадлежит корневому каталогу проекта.Каждый новый пакет, который вы создаете, должен находиться внутри своего собственного подкаталога, и его имя должно совпадать с именем каталога.

go.mod:

module myprojectname

или

module github.com/myname/myproject

Тогдаимпортируйте пакеты вашего проекта, например:

import myprojectname/stuff

или

import github.com/myname/myproject/stuff

Файлы пакета stuff должны находиться в каталоге проекта stuff.Вы называете эти файлы как хотите.

Также возможно создать более глубокую структуру проекта.Например, вы решили отделить файлы исходного кода от других (таких как конфиги приложения, файлы Docker, статические файлы и т. Д.).Переместим каталог stuff в pkg, каждый файл go внутри pkg/stuff по-прежнему будет иметь stuff имя пакета.Чтобы импортировать пакет материалов, просто напишите:

import myprojectname/pkg/stuff

Ничто не мешает вам создать больше уровней в иерархии, например github.com/myuser/myproject/pkg/db/provider/postgresql, где:

  • github.com/myuser/myproject - имя проекта.
  • postgresql - имя пакета.
  • pkg/db/provider/postgresql - путь к пакету относительно корня проекта.

Подробнее о модулях go вы можете прочитать здесь: https://github.com/golang/go/wiki/Modules

Проверьте этот репозиторий, чтобы получить полезную информацию о различных шаблонах, используемых при организации проекта: https://github.com/golang-standards/project-layout Если вы войдете в каталог pkg, вы узнаете, какие проекты с открытым исходным кодом используют pkgкаталог в их структуре.

...