Существуют ли соглашения для имен модулей Go в моно-репо с несколькими модулями? - PullRequest
2 голосов
/ 05 июля 2019

В многомодульном репозитории, должно ли имя модуля (заданное директивой go.mod module) соответствовать соглашениям об именах пакетов?

Например, module github.com/org-name/repo-name/path/to/module-dir

IСледует понимать, что независимо от того, какой модуль назван, пакеты внутри модуля ссылаются друг на друга, используя имя модуля в качестве префикса.Но извне модуля возникают проблемы, если имя модуля установлено не на шаблон <host><path-within-repo>.get -ing пакет, включенный в модуль, затем выдает сообщения о unrecognized import path.

Есть ли причина называть модуль иначе, чем <host><path-within-repo>?

1 Ответ

1 голос
/ 05 июля 2019

Не существует каких-либо жестких требований для ссылки на модули, хотя всегда рекомендуется использовать шаблон домен / репо. Итак, если вы хотите ссылаться на другие модули локально, которых нет в GOPATH, вы можете использовать директиву replace.

https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive

replace также может использоваться для информирования инструмента go об относительном или абсолютном расположении модулей на диске в мультимодульном проекте, например:

replace example.com/project/foo => ../foo

Допустим, у нас есть следующая структура:

├── .gitingore
├── pkg1
│   ├── go.mod
│   └── main.go
└── pkg2
    ├── go.mod
    └── utils.go

pkg1 / main.go

package main

import (
    "fmt"
    "local/pkg2"
)

func main() {
    fmt.Println(pkg2.Add(1, 2))

}

pkg1 / go.mod

module local/pkg1

go 1.12

require local/pkg2 v0.0.0

replace local/pkg2 => ../pkg2

PKG2 / utils.go

package pkg2

func Add(a, b int) int {
    return a + b
}

PKG2 / go.mod

module local/pkg2

go 1.12

Продолжительность:

cd pkg1
go run main.go

Вы получаете:

3

...