6

是否有 API 可以获取使用 go 1.11 模块系统的项目的模块名称?

所以我需要abc.com/a/m从文件中的模块定义module abc.com/a/mgo.mod获取。

4

3 回答 3

5

在撰写本文时,我不知道有任何公开的 API。但是,查看源代码, Go mod 源文件go mod中有一个非常有用的功能

// 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

于 2018-11-07T04:58:29.650 回答
3

尝试这个?

package main

import (
    "fmt"
    "io/ioutil"
    "os"

    modfile "golang.org/x/mod/modfile"
)

const (
    RED   = "\033[91m"
    RESET = "\033[0m"
)

func main() {
    modName := GetModuleName()
    fmt.Fprintf(os.Stdout, "modName=%+v\n", modName)
}

func exitf(beforeExitFunc func(), code int, format string, args ...interface{}) {
    beforeExitFunc()
    fmt.Fprintf(os.Stderr, RED+format+RESET, args...)
    os.Exit(code)
}

func GetModuleName() string {
    goModBytes, err := ioutil.ReadFile("go.mod")
    if err != nil {
        exitf(func() {}, 1, "%+v\n", err)
    }

    modName := modfile.ModulePath(goModBytes)
    fmt.Fprintf(os.Stdout, "modName=%+v\n", modName)

    return modName
}
于 2020-08-13T11:00:20.300 回答
3

如果您的起点是一个go.mod文件并且您要询问如何解析它,我建议从 开始 go mod edit -json,它以 JSON 格式输出特定go.mod文件。这是文档:

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

或者,您可以使用rogpeppe/go-internal/modfile,这是一个可以解析go.mod文件的 go 包,由rogpeppe/gohack和来自更广泛社区的一些其他工具使用。

问题#28101我认为跟踪向 Go 标准库添加新 API 以解析go.mod文件。

以下是文档的片段go mod edit -json

-json 标志以 JSON 格式打印最终的 go.mod 文件,而不是将其写回 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.

于 2019-03-15T21:04:15.940 回答