API для получения имени модуля - PullRequest
0 голосов
/ 07 ноября 2018

Существует ли API для получения имени модуля проекта, который использует систему модулей go 1.11?

, поэтому мне нужно получить abc.com/a/m из определения модуля module abc.com/a/m в go.mod файле.

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Если ваша отправная точка - файл go.mod, и вы спрашиваете, как его проанализировать, я бы предложил начать с go mod edit -json, который выводит конкретный файл go.mod в формате JSON. Вот документация:

https://golang.org/cmd/go/#hdr-Edit_go_mod_from_tools_or_scripts

В качестве альтернативы вы можете использовать rogpeppe / go-internal / modfile , который представляет собой пакет go, который может анализировать файл go.mod и который используется rogpeppe / gohack и некоторые другие инструменты от более широкого сообщества.

Issue # 28101 Я думаю, что отслеживает добавление нового API в стандартную библиотеку Go для анализа go.mod файлов.

Вот фрагмент документации для go mod edit -json:

Флаг -json печатает окончательный файл go.mod в формате JSON вместо писать обратно на go.mod. Выход JSON соответствует этим Go Типы:

type Module struct {
    Path string
    Version string
}

type GoMod struct {
    Module  Module
    Go      string
    Require []Require
    Exclude []Module
    Replace []Replace
}

type Require struct {
    Path string
    Version string
    Indirect bool
}

Вот пример фрагмента вывода JSON из go mod edit -json, в котором показан фактический путь к модулю (имя модуля), который был вашим первоначальным вопросом:

{
        "Module": {
                "Path": "rsc.io/quote"
        },

В этом случае имя модуля - rsc.io/quote.

0 голосов
/ 07 ноября 2018

На момент написания этой статьи я не знал ни о каких открытых API для этого. Однако, глядя на go mod источники, есть функция, которая может быть весьма полезна в Go исходном файле мода

// ModulePath returns the module path from the gomod file text.
// If it cannot find a module path, it returns an empty string.
// It is tolerant of unrelated problems in the go.mod file.
func ModulePath(mod []byte) string {
    //...
}

func main() {

    src := `
module github.com/you/hello

require rsc.io/quote v1.5.2
`

    mod := ModulePath([]byte(src))
    fmt.Println(mod)

}

Какие выходы github.com/you/hello

...