为了账号安全,请及时绑定邮箱和手机立即绑定

获取模块名称的API

获取模块名称的API

Go
翻阅古今 2023-05-08 14:55:30
是否有 API 可以获取使用 go 1.11 模块系统的项目的模块名称?所以我需要从文件中的abc.com/a/m模块定义中获取。module abc.com/a/mgo.mod
查看完整描述

4 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

在撰写本文时,我不知道有任何公开的 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


查看完整回答
反对 回复 2023-05-08
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

尝试这个?


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

}


查看完整回答
反对 回复 2023-05-08
?
交互式爱情

TA贡献1712条经验 获得超3个赞

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

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

Issue #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.


查看完整回答
反对 回复 2023-05-08
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

从 Go 1.12 开始(对于那些通过搜索找到它的人来说,他们使用的是模块,但不一定是 OP 提到的旧版本),该runtime/debug包包括获取有关构建的信息的功能,包括模块名称。例如:

import (

    "fmt"

    "runtime/debug"

)


func main() {

    info, _ := debug.ReadBuildInfo()

    fmt.Printf("info: %+v", info.Main.Path)

}


查看完整回答
反对 回复 2023-05-08
  • 4 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信